home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 24
/
AACD 24.iso
/
AACD
/
Programming
/
2b_CreativE
/
src
/
linker.s
< prev
next >
Wrap
Text File
|
2001-01-29
|
100KB
|
4,967 lines
;; Linker
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; The Unit Linking Subroutines. ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
HunkList:
DC.L 0
NumHunks:
DC.L 1
bgName:
DC.L 0
bgPri:
DC.l 0
SetupMod:
DC.L 0
CleanupMod:
DC.L 0
InitError: ; [internal]
DC.W 0
;; Link module
MMODE: DC.W 0 ; =D1
THISMOD: DC.L 0
MINIMUMMODULE:
MOVEQ #2,D1 ; MODULE IN MAIN FROM OTHER MODULE
BRA.S MODULESTART
MODULEJOBENTRY:
MOVEQ #0,D1 ; NORMAL MODULE IN MAIN
TSTMOD
BEQ.S MODULESTART
MOVEQ #1,D1 ; MODULE IN MODULE
MODULESTART:
MOVE.W D1,MMODE
CLR.W LOADEDVERSION
DOMODULEJOB: ; A0=PTR JOBCODE
MOVE.W MMODE(PC),D1
MOVE.W (A0)+,D0 ; CAN TRASH ANYTHING
BEQ.S .1
CMP.W #1,D0
BEQ ADDCONST
CMP.W #2,D0
BEQ ADDOBJECT
CMP.W #3,D0
BEQ ADDCODE
CMP.W #4,D0
BEQ ADDPROCS
CMP.W #5,D0
BEQ ADDSYSCONST
CMP.W #6,D0
BEQ BINDOTHERLIB
CMP.W #7,D0
BEQ ADDRELOC
CMP.W #8,D0
BEQ ADDGLOBSENTRY
CMP.W #9,D0
BEQ ADDMODULES
CMP.W #10,D0
BEQ.S ADDDEBUG
CMP.W #11,D0
BEQ.S ADDMACROS
BRA ERROR36 ; SUPPOSED TO BE OTHER JOBCODES
.1: RTS
;; AddMacros
ADDMACROS:
JSR PREPREADMACROS
BRA DOMODULEJOB
;*-*
;; AddDebug
ADDDEBUG:
MOVE.L A0,A6 ; A6=DEBUGHUNK
MOVE.L 4(A6),D0
ADDQ.L #2,D0
LSL.L #2,D0
ADD.L D0,A0 ; skip LINE debug
CMP.W #1,D1
BEQ.S .NL
GETM A2
MOVE.L CODELIST(PC),D0
BNE.S .NN
MOVE.L A2,CODELIST
BRA.S .C
.NN: MOVE.L CODETAIL(PC),A1
MOVE.L A2,(A1)
.C: MOVE.L A2,CODETAIL
CLR.L (A2)+
MOVE.W #8,(A2)+
MOVE.L DEBUGLIST,(A2)
MOVE.L A2,DEBUGLIST
ADDQ.L #4,A2
MOVE.L A6,(A2)+
CLR.L (A2)+
DONEM A2
.NL: CMP.L #$3F1,(A0)
BNE.S .NL2
MOVE.L 4(A0),D0
ADDQ.L #2,D0
LSL.L #2,D0
ADD.L D0,A0 ; skip EVAR debug
.NL2: TST.L (A0)+ ; BLANK TERMINATOR
BNE ERROR36
BRA DOMODULEJOB
;*-*
;; AddModules
ADDMODULES:
MOVE.L (A0)+,D0
CMP.W #1,D1
BNE.S .XL
ADD.L D0,A0
BRA.W DOMODULEJOB
.XL:MOVE.W (A0)+,D0
BEQ.W .X
MOVE.L A0,A1 ; A1=MODNAME
ADD.W D0,A0
MOVE.L A1,A2
.C: TST.B (A2)+
BNE.S .C
MOVE.L A2,CACHENAMEEND
MOVE.L A1,CACHENAMESTART
JSR SEARCHINMODLIST
GETM A3
TST.L D0
BNE.S .L2
ADDQ.W #1,AGAIN ; SIGNAL NEW MODULES
MOVE.L MODINFOLIST,(A3) ; MI_NEXT
MOVE.L A3,MODINFOLIST
ADDQ.L #4,A3
MOVE.W #$100,(A3)+ ; MI_FLAGS
SUB.L A1,A2
MOVE.L A2,(A3)+ ; MI_NAMELEN
CLR.L (A3)+ ; MI_MOD
CLR.L (A3)+ ; MI_LIST
MOVE.L A1,(A3)+ ; MI_NAMEPTR
.L2: MOVE.W (A0)+,D0
BEQ.S .D
MOVE.W (A0)+,D1
MOVE.L A0,A1 ; A1=PROCCLASS NAME
ADD.W D1,A0
MOVE.L CODELIST(PC),D1 ; HOOKUP TAIL OF CODEREM
BNE.S .NN
MOVE.L A3,CODELIST
BRA.S .CC
.NN: MOVE.L CODETAIL(PC),A2
MOVE.L A3,(A2)
.CC: MOVE.L A3,CODETAIL
CLR.L (A3)+
CMP.W #1,D0
BEQ.S .CL
MOVE.W #5,(A3)+ ; PROC/LAB ACCESS
MOVE.L A1,(A3)+
MOVE.L A0,(A3)+
ADDQ.L #2,A0
MOVE.W (A0)+,D0
LSL.W #2,D0
ADD.W D0,A0
BRA.S .L2
.CL: MOVE.W #6,(A3)+ ; CLASS ACCESS
MOVE.L A1,(A3)+
MOVE.L A0,(A3)+
MOVE.W (A0)+,D0
MULU #6,D0
ADD.W D0,A0
BRA.S .L2
.D: DONEH A3
BRA.W .XL
.X: BRA.W DOMODULEJOB
;*-*
;; AddGlobals
ADDGLOBSENTRY:
MOVEQ #0,D2
CMP.W #SKIPMARK,(A0)
BNE.S .1
ADDQ.L #2,A0
MOVE.L (A0)+,D2
.1: CMP.W #1,D1
BNE.S ADDGLOBS
ADD.L D2,A0
TST.L D2
BNE.W DOMODULEJOB
INTERN 103
ADDGLOBS:
MOVE.W (A0)+,D0 ; D0=LEN
BMI.W DOMODULEJOB
MOVE.L A0,A1 ; A1=NAME
ADD.W D0,A0
MOVE.L A0,A2 ; A2=OFFSETSTAB
MOVE.W LOADEDVERSION(PC),D2
SUB.W #10,D2
.XL:TST.L (A0)+
BEQ.S .OUT
TST.W D2
BMI.S .XL
ADDQ.L #2,A0
BRA.S .XL
.OUT: TST.W D0 ; NOW FIND OFFSET
BNE.S VREF
GETM A5 ; NOT LINKED INTO HASH TABLE!
MOVE.L #.NAME,(A5)+ ; ANONYMOUS VARIABLE
MOVE.B #GLOBV,(A5)+ ; SET GLOBAL(=2)
MOVE.B #5,(A5)+ ; REF+EXPORT
CLR.L (A5)+
SUBQ.W #4,NRGLOB
MOVE.W NRGLOB,D2
MOVE.W D2,(A5)+ ; SET OFFS
EXT.L D2
DONEM A5
MOVE.L A5,D2
SUBQ.L #8,D2
SUBQ.L #4,D2
BRA ODONE
.NAME: DC.B 0,0
VREF: MOVE.L A1,A3 ; SEARCH FOR VAR
HASH A3,D2,D1
LSL.L #2,D2
ADD.L #IDENTHASH,D2
MOVE.L D2,A3 ; A3=HASHENTRYPTR
LEA 4(A3),A4
.SL: MOVE.L -(A4),A4
MOVE.L A4,D2
BEQ.S .NOTF
MOVE.L (A4),A5
MOVE.L A1,A6
.CL: CMPM.B (A5)+,(A6)+
BNE.S .SL
TST.B -1(A5)
BNE.S .CL
MOVE.L A4,D2 ; JAAAH, BESTAAT REEDS!
BRA.S ODONE
.NOTF: GETM A5 ; LINKED INTO HASH TABLE!
MOVE.L (A3),(A5)+
MOVE.L A5,(A3)
MOVE.L A1,(A5)+ ; ASCIIPTR
MOVE.B #GLOBV,(A5)+ ; SET GLOBAL(=2)
MOVE.B #5,(A5)+ ; REF+EXPORT
CLR.L (A5)+
SUBQ.W #4,NRGLOB
MOVE.W NRGLOB,D2
MOVE.W D2,(A5)+ ; SET OFFS
MOVE.L A5,D2
SUBQ.L #8,D2
SUBQ.L #4,D2
DONEM A5
;BRA ODONE
ODONE: GETM A3 ; GOT VAR IN D2, NOW HANG IN CODEREM LIST
MOVE.L CODELIST(PC),D1
BNE.S .NN
MOVE.L A3,CODELIST
BRA.S .C
.NN: MOVE.L CODETAIL(PC),A4
MOVE.L A3,(A4)
.C: MOVE.L A3,CODETAIL
CLR.L (A3)+
MOVE.W #4,(A3)+
MOVE.L A2,(A3)+
MOVE.L D2,(A3)+
MOVE.W LOADEDVERSION(PC),(A3)+
DONEM A3
BRA ADDGLOBS
;*-*
;; AddCode
ADDCODE:
MOVE.L (A0)+,D7
CMP.W #1,D1
BEQ.S .SKIP
GETM A2
MOVE.L CODELIST(PC),D0
BNE.S .NN
MOVE.L A2,CODELIST
BRA.S .C
.NN: MOVE.L CODETAIL(PC),A1
MOVE.L A2,(A1)
.C: MOVE.L A2,CODETAIL
CLR.L (A2)+
MOVE.W #2,(A2)+
MOVE.L A0,(A2)+
MOVE.L D7,(A2)+
LSL.L #2,D7
ADD.L D7,A0
DONEM A2
BRA DOMODULEJOB
.SKIP: LSL.L #2,D7
ADD.L D7,A0
BRA DOMODULEJOB
;*-*
CODELIST: DC.L 0
CODETAIL: DC.L 0
;; AddReloc
ADDRELOC:
MOVE.L (A0)+,D7
CMP.W #1,D1
BEQ.S .SKIP
GETM A2
MOVE.L CODELIST(PC),D0
BNE.S .NN
MOVE.L A2,CODELIST
BRA.S .C
.NN: MOVE.L CODETAIL(PC),A1
MOVE.L A2,(A1)
.C: MOVE.L A2,CODETAIL
CLR.L (A2)+
MOVE.W #3,(A2)+
MOVE.L A0,(A2)+
MOVE.L D7,(A2)+
CLR.L (A2)+
LSL.L #2,D7
ADD.L D7,A0
DONEM A2
BRA DOMODULEJOB
.SKIP: LSL.L #2,D7
ADD.L D7,A0
BRA DOMODULEJOB
;*-*
;; AddSystem
ADDSYSCONST:
MOVE.L (A0)+,D0
CMP.W #1,D1
BEQ.S .S1
ADD.L D0,MINSTACK ; ADD USED TO STACK
.S1: MOVE.W (A0)+,D0
CMP.W OSVERSION,D0 ; HIGHEST OSVERSION
BLE.S .1
MOVE.W D0,OSVERSION
BSET #4,WARNINGS+3
.1: MOVE.L (A0)+,D0
AND.L #%11011011000110000000000000000000,D0 ; ONLY INTERESTING BITS
OR.L D0,CODEPREFS
MOVE.W (A0)+,D0
CMP.W ECPU,D0 ; BEST CPU
BLE.S .2
MOVE.W D0,ECPU
BSET #4,WARNINGS+3
.2: MOVE.W (A0)+,D0 ; BEST FPU
CMP.W EFPU,D0
BLE.S .3
MOVE.W D0,EFPU
BSET #4,WARNINGS+3
.3: MOVE.W (A0)+,D0 ; OR BITSET
MOVE.W ASMCPU,D3
OR.W D3,D0
CMP.W D3,D0
BEQ.S .4
MOVE.W D0,ASMCPU
BSET #4,WARNINGS+3
.4: MOVE.W (A0)+,D0 ; VERSION
BNE.S .5
ADDQ.W #1,D0 ; 0 is version 1
.5: MOVE.W D0,LOADEDVERSION
CMP.W #CURVERSION,D0
BHI ERROR51
ADDQ.L #4,A0 ; RESERVED
CMP.W #11,LOADEDVERSION
BLT .x
MOVE.L (A0)+,D0
AND.L #%1,D0
OR.L D0,ICODEPREFS
.x:
JSR PATCHER
BRA DOMODULEJOB
;*-*
;; AddProcs
ADDPROCS:
.XL:MOVE.W (A0)+,D0
CMP.W #-1,D0
BEQ DOMODULEJOB
GETM A4
EXT.L D0
MOVE.L A0,A1
HASH A1,D1,D2
LSL.L #2,D1
MOVE.L #IDENTHASH,A1
ADD.L D1,A1
MOVE.L (A1),(A4)+
MOVE.L A4,(A1)
MOVE.L A4,D6 ; REMIND THIS IDENT=D6
MOVE.L A0,(A4)+
; MOVEM.L D0-A6,-(A7)
; MOVE.L A0,D2
;.xx:TST.B (A0)+
; BNE .xx ; this section
; MOVE.L A0,D3 ; writes down
; SUB.L D2,D3 ; the procedures
; JSR WRITECON
; MOVE.L #CLINE,D2
; MOVEQ #2,D3
; JSR WRITECON
; MOVEM.L (A7)+,D0-A6
MOVE.B #LAB,(A4)+
MOVE.B #1,(A4)+ ; FLAGS: USED (NEVER EXPORT!)
ADD.L D0,A0 ; skip name
MOVE.L (A0)+,D7 ; D7=OFFSET
CMP.W #1,(A0)+ ; label/proc
BNE .LAB ;
LEA 14(A4),A3 ; note: 14
MOVE.L A3,(A4)+ ; Proc ptr
MOVE.W #-2,(A4)+ ; type [proc]
CLR.L (A4)+ ; heavy
MOVE.L PROCLIST,(A4)+ ; now proc:
MOVE.L A4,PROCLIST ;
MOVE.W (A0)+,(A4)+ ; args
CLR.W (A4)+ ; FLAGS,REGVARS
MOVE.W (A0)+,(A4)+ ; nr loc vars
CMP.W #-1,(A0)
BEQ .REGSONLY
CMP.W #-2,(A0)
BEQ .MORE_STUFF
MOVE.L A0,(A4)+ ; DEFARGS
.REGSBACK:
CLR.L (A4)+ ; of_object
MOVE.L D6,(A4)+ ; IDENT
CLR.L (A4)+ ; SELF
CLR.L (A4)+ ; METHOD
MOVE.W (A0)+,D0
LSL.W #2,D0
ADD.W D0,A0
MOVE.W (A0)+,D0
ADD.W D0,A0
BRA .CODE
.REGSONLY:
ADDQ.L #2,A0
moveq #0,d0
MOVE.W (A0),D0
ADD.L D0,D0
BSET #5,-4(a4)
move.l a0,(a4)+
ADD.L D0,A0
ADDQ.L #2,A0
bra .REGSBACK
.MORE_STUFF:
ADDQ.L #2,A0
MOVEM.L D0-D7/A1-A6,-(A7)
MOVEQ #8,D0
JSR NEW
MOVE.L D0,A1
cmp.w #64,(a0)+
BEQ .M2
MOVE.L CleanupMod(PC),(A1)+
MOVe.L A1,CleanupMod
BSET #7,-4(A4)
BRA .M1
.M2:MOVE.L SetupMod(PC),(A1)+
MOVe.L A1,SetupMod
BSET #6,-4(A4)
.M1:MOVE.L A4,(A1)
SUB.L #6,(A1)+
MOVEM.L (A7)+,D0-D7/A1-A6
CLR.L (A4)+
BRA .REGSBACK
.LAB: CLR.L (A4)+ ; LABEL
MOVE.W #-1,(A4)+
CLR.L (A4)+ ; EXTRA!!
.CODE: CMP.W #1,MMODE ; CHECK IF MOD IN MOD
BEQ.S .1
MOVE.L CODETAIL(PC),A1
MOVE.L A4,(A1)
MOVE.L A4,CODETAIL
CLR.L (A4)+
MOVE.W #1,(A4)+
MOVE.L D6,(A4)+
MOVE.L D7,(A4)+
.2: DONEM A4
BRA .XL
.EX: BRA DOMODULEJOB
.1: MOVE.L THISMOD(PC),A1 ; A1=MODINFO
MOVE.L D6,A2 ; A2=ID
SUBQ.W #2,10(A2)
MOVE.L MI_LIST(A1),(A4) ; PC_NEXT
MOVE.L A4,MI_LIST(A1)
MOVE.L A4,VARHEAVY(A2)
ADDQ.L #4,A4
MOVE.W #2,(A4)+ ; PC_TYPE
MOVE.L D6,(A4)+ ; PC_INFO
CLR.L (A4)+ ; PC_ACC
BRA.S .2
;*-*
;; FixProcCode
FIXPROCCODE: ; RESOLVE ADDRESSES OF CODE IN MODULES
MOVEM.L A0-A3/D0-D4/A5,-(A7) ; EXPECTS CODE IN A4
LEA CODELIST(PC),A0 ; A0=CODEREM
MOVE.L LABM+8,A2 ; A2=LABELS
.XL:MOVE.L (A0),A0
MOVE.L A0,D0
BEQ .E
MOVE.W 4(A0),D0
CMP.W #2,D0
BNE.S .ID
MOVE.L 6(A0),A1 ; CODE + LEN
MOVE.L 10(A0),D1
SUBQ.L #1,D1
MOVE.L A4,D2 ; D2=COPIED CODEBASE
MOVE.L D2,10(A0) ; SET LEN FIELD TO CODEBASE!
MOVE.L D1,D0 ;
LSL.L #2,D0 ;
ADD.L A4,D0 ; CHECK CODEBUF
MOVE.L D0,CURACODE ;
JSR CHECK3 ;
MOVE.L A4,CURACODE ;
.C: MOVE.L (A1)+,(A4)+
DBRA D1,.C
BRA.S .XL
.ID: CMP.W #1,D0
BNE.S .REL
MOVE.L 6(A0),A3
MOVEQ #0,D3
MOVE.W 10(A3),D3
LSL.L #2,D3
MOVE.L 10(A0),D1 ; OFFSET
ADD.L D2,D1
MOVE.L D1,0(A2,D3.L) ; SET LABEL
BRA.S .XL
.REL: CMP.W #3,D0
BNE.S .GLOB
MOVE.L A4,-(A7)
MOVE.L 6(A0),A3
MOVE.L 10(A0),D3
SUBQ.L #1,D3
MOVE.L A0,-(A7)
MOVE.L #EFUNCBYTE,A1
MOVE.L D2,D4
SUB.L ACODE,D4 ; D4=MOD OFFSET
.RELL:
MOVE.L (A3),D0
BPL.S .NEXT
MOVEQ #31,D1
BCLR D1,D0
MOVE.L D0,A4
ADD.L D2,A4
MOVE.W 2(A4),D0
JSR ADDBRANCHRELOC
MOVE.B #-1,-10(A1,D0)
ADDQ.L #4,A3
DBRA D3,.RELL
BRA.S .Q
.NEXT:
ADDQ.L #4,A3 ; WAS: ADD.L D4,(A3)+
ADD.L D2,D0
MOVE.L D0,A5
ADD.L D4,(A5) ; PATCH NEW CODE
DBRA D3,.RELL
.Q: MOVE.L (A7)+,A0
MOVE.L (A7)+,A4
BRA .XL
.GLOB: CMP.W #4,D0
BNE.S .CLSSX
MOVE.L 10(A0),A3
MOVE.W 10(A3),D0 ; D0.W=A4OFFSET
MOVE.L 6(A0),A3
CMP.W #10,14(A0)
BPL.S .NG
.GLL: MOVE.L (A3)+,D1
BEQ .XL
MOVE.L D1,A1
ADD.L D2,A1
MOVE.W D0,(A1)
BRA .GLL
.NG: ADDQ.W #4,D0 ; VERSION WITH EXTRA OPERSIZE
.NGLL: MOVE.L (A3)+,D1
BEQ .XL
MOVE.L D1,A1
ADD.L D2,A1
MOVE.W D0,D3
SUB.W (A3)+,D3
MOVE.W D3,(A1)
BRA .NGLL
.CLSSX: CMP.W #7,D0 ; CLASSX ACC RESOLVE HERE
BNE.W .CLASS
MOVE.L 10(A0),D0
ADD.L D2,D0 ; D0=ABS DELCODE
MOVE.L 6(A0),A1 ; A1=OBJH
MOVE.L D0,ODCODE(A1)
MOVE.L 14(A0),A3 ; A3=ACCVALS
LEA OACC(A1),A1 ; A1=ACCLIST
MOVE.L A0,-(A7)
.CLL: MOVE.W (A3)+,D0
CMP.W #-1,D0
BEQ.S .CLLX
GETM A0
MOVE.L (A1),(A0)
MOVE.L A0,(A1)
ADDQ.L #4,A0
MOVE.L (A3)+,D1
ADD.L D2,D1
MOVE.L D1,(A0)+
MOVE.W D0,(A0)+
DONEM A0
BRA.S .CLL
.CLLX: MOVE.L (A7)+,A0
BRA .XL
.DEBUG: CMP.W #8,D0
BNE.S .PROC
MOVE.L D2,D1
SUB.L ACODE,D1
MOVE.L D1,14(A0)
BRA .XL
.PROC: CMP.W #5,D0
;BNE.S . ; PROC ACC RESOLVE HERE
BRA .XL
.CLASS: CMP.W #6,D0 ; CLASS ACC RESOLVE HERE
BNE.S .DEBUG
MOVE.L 6(A0),D1
JSR FINDOBJ
TST.L D0
BEQ.S .NOTF
MOVE.L D0,A1 ; A1=OBJ
LEA OACC(A1),A1
MOVE.L 10(A0),A3 ; A3=ACCL
MOVE.W (A3)+,D0
SUBQ.L #1,D0
.CAL: GETM A6
MOVE.L (A1),(A6)
MOVE.L A6,(A1)
ADDQ.L #4,A6
MOVE.L (A3)+,D1
ADD.L D2,D1
MOVE.L D1,(A6)+
MOVE.W (A3)+,(A6)+
DONEM A6
DBRA D0,.CAL
BRA .XL
.NOTF: MOVE.L D1,ERROROBJ
BRA ERROR57
.E: MOVEM.L (A7)+,A0-A3/D0-D4/A5
RTS
;*-*
;; AddConst
ADDCONST:
CMP.W #6,LOADEDVERSION
BMI.S .XL
MOVE.L (A0)+,D0
CMP.W #2,D1
BNE.S .XL
ADD.L D0,A0
BRA DOMODULEJOB
.XL:cmp.b #-1,(a0)
beq .TYPED
MOVE.W (A0)+,D0 ; D0=LEN ASC
BEQ.S .1
GETM A5
MOVE.L (A0)+,D1
MOVE.L A0,A1
bsr .H
LSL.L #2,D2
ADD.L #CONSTHASH,D2
MOVE.L D2,A1
MOVE.L (A1),(A5)
MOVE.L A5,(A1)
ADDQ.L #4,A5
MOVE.L A0,(A5)+
MOVE.L D1,(A5)+
CLR.W (A5)+
EXT.L D0
ADD.L D0,A0
DONEM A5
BRA.S .XL
.1: BRA DOMODULEJOB
.H: HASH A1,D2,D3
RTS
.TYPED:
addq.l #2,a0
MOVE.W (A0)+,D0 ; D0=LEN ASC
BEQ.S .1
GETM A5
MOVE.L A0,A1
bsr .H
LSL.L #2,D2
ADD.L #CONSTHASH,D2
MOVE.L D2,A1
MOVE.L (A1),(A5)
MOVE.L A5,(A1)
ADDQ.L #4,A5
MOVE.L A0,(A5)+
ext.l d0
add.l d0,a0
move.w (a0),d0
addq.l #3,d0
MOVE.L a0,(A5)+
move.b #2,(a5)+
CLR.B (A5)+
ext.l d0
ADD.L D0,A0
move.l a0,d0
btst #0,d0
beq .CC
addq.l #1,d0
.CC:DONEM A5
BRA .XL
;*-*
;; AddObject
ADDOBJECT:
CMP.W #6,LOADEDVERSION
BMI.S .1
MOVE.L (A0)+,D0
;CMP.W #2,D1 ; ever?
;BNE.S .1
;ADD.L D0,A0
;BRA DOMODULEJOB
.1: ADDQ.W #1,OBJCOUNT
MOVE.W OBJCOUNT(PC),D5
GETM A5
MOVE.W (A0)+,D0 ; D0=LEN ASC
BEQ ERROR39 ; module crashed
MOVE.W (A0)+,D1 ;
CMP.W #-1,D1 ;
BNE ERROR39 ; must be object header
MOVE.L OLIST,(A5)+ ;
MOVE.L A5,OLIST ;
ADDQ.L #2,A0 ; OFF MAKES NO SENSE FOR HEAD
CLR.W (A5)+ ; DELEGATESIZE=0
MOVE.W #%1000000000,(A5)+ ; SET IMPORT
MOVE.L A5,A4 ; A4=SIZE.W OBJ
CLR.W (A5)+ ; STILL 0
MOVE.W D5,(A5)+
MOVE.L A0,(A5)+
cmp.l #"exec",(A0)
bne .0
CMP.L #"base",4(a0)
bne .0
cmp.b #0,8(a0)
bne .0
move.l OLIST,OBJ_EXECBASE
.0:
cmp.l #"intu",(a0)
bne .01
cmp.l #"itio",4(a0)
bne .01
cmp.l #"nbas",8(a0)
bne .01
cmp.w #"e"*256,12(a0)
bne .01
move.l OLIST,OBJ_INTUIBASE
.01:
cmp.l #"gfxb",(a0)
bne .02
cmp.l #"ase"*256,4(a0)
bne .02
move.l OLIST,OBJ_GFXBASE
.02:
cmp.l #"dosb",(a0)
bne .03
cmp.l #"ase"*256,4(a0)
bne .03
move.l OLIST,OBJ_DOSBASE
.03:
cmp.l #"wbst",(a0)
bne .04
cmp.l #"artu",4(a0)
bne .04
cmp.w #"p"*256,8(a0)
bne .04
move.l OLIST,OBJ_WBMESSAGE
.04:
cmp.l #"rast",(a0)
bne .05
cmp.l #"port",4(a0)
bne .05
tst.b 8(a0)
bne .05
move.l OLIST,OBJ_RASTPORT
.05:
MOVE.L A5,A6 ; A6=_TAIL_ MEMBER LIST
CLR.L (A5)+ ; MEMBERLIST=0
CLR.L (A5)+ ; METHODLIST=0
CLR.L (A5)+ ; SUPERCLASS=0
CLR.L (A5)+ ; DELEGATECODE=NIL
CLR.L (A5)+ ; ACCESLIST
MOVE.L #-1,(A5)+ ; DELOFFSET+DESTRUCTOFF
EXT.L D0
ADD.L D0,A0
DONEM A5
ADDOBJECTLOOP:
MOVE.W (A0)+,D0 ; D0=LEN ASC
BEQ .1 ; last one
GETM A5 ;
MOVE.W (A0)+,D1 ;
CLR.L (A5)+ ; ONEXT
MOVE.L A5,(A6) ;
LEA ONEXT(A5),A6 ;
CLR.L (A6) ;
MOVE.W (A0)+,(A5)+ ; OOFF
CLR.W (A5)+ ; OFLAGS
MOVE.W D1,(A5)+ ; OSIZE
MOVE.W D5,(A5)+ ; OID
TST.W D0
BMI.S .PRIV
MOVE.L A0,(A5)+ ; OASCII
EXT.L D0
ADD.L D0,A0
BRA.S .3
.PRIV:
CLR.L (A5)+ ; OASCII
.3: CMP.W #6,LOADEDVERSION
BMI.S .4
MOVEQ #0,D0
MOVE.W (A0)+,D0
BEQ.S .4
BPL.S .5
MOVE.W (A0)+,D0
; HERE WE CAN SEARCH FOR AN OBJECT THAT EQUALS A0
MOVE.L A0,(A5)+
ADD.W D0,A0
MOVE.L OBJTYPELIST(PC),D0
MOVE.L A5,OBJTYPELIST
.5: MOVE.L D0,(A5)+
BSET #1,OFLAGS+4(A6)
.4: DONEM A5
BRA ADDOBJECTLOOP
.1: MOVE.W (A0)+,D0
BTST #0,D0
BEQ.S .2
ADDQ.W #1,D0
.2: MOVE.W D0,(A4) ; SET OBJSIZE
CMP.W #7,LOADEDVERSION
BMI.W .NC
MOVE.W (A0)+,D0
BEQ.W .NC
MOVE.L OLIST,A1 ; A1=OBJECTHEAD
MOVE.W D0,ODEL(A1)
MOVE.L (A0)+,D0 ; DELCODE
CMP.W #1,MMODE
BEQ.S .NDC
GETM A3
MOVE.L CODELIST(PC),D1 ; HOOKUP TAIL OF CODEREM
BNE.S .NN
MOVE.L A3,CODELIST
BRA.S .CC
.NN: MOVE.L CODETAIL(PC),A2
MOVE.L A3,(A2)
.CC: MOVE.L A3,CODETAIL
MOVE.L A3,D7 ; D7=CODEREM_STRUCT
CLR.L (A3)+
MOVE.W #7,(A3)+
MOVE.L A1,(A3)+
MOVE.L D0,(A3)+
CLR.L (A3)+
DONEM A3
BRA.S .CONT
.NDC:
MOVEM.L A6/A5,-(A7)
MOVE.L THISMOD(PC),A6 ; A6=MODINFO
CLR.L ODCODE(A1)
GETM A5
MOVE.L MI_LIST(A6),(A5) ; PC_NEXT
MOVE.L A5,MI_LIST(A6)
ADDQ.L #4,A5
MOVE.W #1,(A5)+ ; PC_TYPE
MOVE.L A1,(A5)+ ; PC_INFO
CLR.L (A5)+ ; PC_ACC
DONEM A5
MOVEM.L (A7)+,A6/A5
.CONT: ADD.W (A0)+,A0 ; SKIP SUPER
MOVE.L (A0)+,ODELOFF(A1) ; DELOFF+DESTR
LEA OMETHOD(A1),A3 ; A3=METHODLIST
.ML: MOVE.W (A0)+,D0
CMP.W #-1,D0
BEQ.S .MX
GETM A2 ; A2=MEM
MOVE.L A2,A4 ; A4=METHOD
MOVE.L (A3),(A2) ; M_NEXT
MOVE.L A4,(A3)
ADDQ.L #8,A2
MOVE.W D0,(A2)+ ; M_TYPE+M_FLAGS
MOVE.W (A0)+,(A2)+ ; M_OFF
MOVE.W (A0)+,D0
MOVE.L A0,(A2)+ ; M_NAME
ADD.W D0,A0
MOVE.L A2,4(A4) ; M_PROC
MOVE.W (A0)+,(A2)+ ; PROC_NARGS
MOVE.L #$2000000,(A2)+ ; flags=method
CLR.L (A2)+
MOVE.W (A0)+,D0
BEQ.S .NDA
MOVE.L A0,-4(A2) ; PROC_DEFARGS
SUBQ.L #2,-4(A2)
LSL.W #2,D0
ADD.W D0,A0
.NDA: MOVE.L A1,(A2)+ ; PROC_OFOBJECT
CLR.L (A2)+
CLR.L (A2)+
MOVE.L A4,(A2)+ ; PROC_METHOD
DONEM A2
BRA.S .ML
.MX:
CMP.W #1,MMODE
BEQ.S .AS
MOVE.L D7,A2
MOVE.L A0,14(A2)
.AS:
.AL: CMP.W #-1,(A0)+
BEQ.S .AX
ADDQ.L #4,A0
BRA.S .AL
.AX:
.NC: BRA DOMODULEJOB
;*-*
OBJTYPELIST: DC.L 0
;; FixObjTypes
FIXOBJTYPES:
LEA OBJTYPELIST(PC),A6
.XL:MOVE.L (A6),D0
BEQ.S .X
MOVE.L D0,A6
MOVE.L -4(A6),D1
JSR FINDOBJ
TST.L D0
BEQ.S .ER
.R: MOVE.L D0,-4(A6)
BRA.S .XL
.X: RTS
.ER: MOVEQ #4,D0
BRA.S .R
; MOVE.L -4(A6),ERROROBJ
; BRA ERROR62
;*-*
;; BindOtherLib
BINDOTHERLIB:
CMP.W #2,D1 ; JUST DONE IF LIBINFOS IN SECONDARY
BNE.S .1
RTS
.1: TST.B (A0)+ ; SKIP LIBNAME FOR NOW
BNE.S .1
MOVE.L A0,A1
HASH A1,D0,D1
LSL.L #2,D0
ADD.L #IDENTHASH,D0
MOVE.L D0,A1
MOVE.L A1,A4
ADDQ.L #4,A4
.SL: MOVE.L -(A4),D0
BEQ.S .SD
MOVE.L D0,A4
MOVE.L (A4),A5
MOVE.L A0,A6
.SC: CMPM.B (A5)+,(A6)+
BNE.S .SL
TST.B -1(A5)
BNE.S .SC
CMP.B #GLOBV,4(A4)
BNE.S .SL
MOVE.W 10(A4),D7
BRA.W BLABLABLA
.SD: GETM A5 ; ADD BASE AS VAR
MOVE.L (A1),(A5)+
MOVE.L A5,(A1)
MOVE.L A0,(A5)+ ; SET ASCIIPTR
MOVE.B #GLOBV,(A5)+ ; SET GLOBAL(=2)
MOVE.B #4,(A5)+ ; UNREF+SYSTEMVAR+EXPORT
CLR.L (A5)+
SUBQ.W #4,NRGLOB
MOVE.W NRGLOB,(A5)+ ; SET OFFS
DONEM A5
BLURP:
LEA -12(A5),A5
TSTMOD
BEQ.S .3 ; REMEMBER OFFSET
GETM A1
MOVE.L OFFSLIST(PC),(A1)+
MOVE.L A5,(A1)+
DONEM A1
SUBQ.L #8,A1
MOVE.L A1,OFFSLIST
.3: GINFO A0,A1,A5
MOVE.W NRGLOB,D7 ; BASE OF LIB
BLABLABLA:
.2: TST.B (A0)+
BNE.S .2
MOVE.L A0,A5
MOVE.L A0,-(A7)
BSR.W ADDLIBS2
MOVE.L (A7)+,A0
RTS
OFFSLIST: DC.L 0
DOOFF: ; GETS OFF IN D0, PRESERVES D0
TSTMOD
BEQ.S .1
CMP.W #GLOBOFF+8,D0
BPL.S .1
MOVEM.L A0/A1/D1,-(A7)
LEA OFFSLIST(PC),A0
.XL:MOVE.L (A0),A0
MOVE.L A0,D1
BEQ.S .3
MOVE.L 4(A0),A1
CMP.W 10(A1),D0
BNE.S .XL
GENGI A1,D1
MOVEM.L (A7)+,A0/A1/D1
.1: RTS
.3: INTERN 101
;*-*
SETUPLIBS:
BSR ADDLIBS
RTS
SETUPUTIL:
LEA UTIL,A5
MOVE.W #-124,D7
BSR ADDLIBS2
RTS
ADDLIBS:
LEA EXEC,A5
MOVE.W #-40,D7
BSR.S ADDLIBS2
LEA DOS,A5
MOVE.W #-44,D7
BSR.S ADDLIBS2
LEA INTUI,A5
MOVE.W #-48,D7
BSR.S ADDLIBS2
LEA GFX,A5
MOVE.W #-52,D7
BSR.S ADDLIBS2
; LEA MATH(PC),A5
; MOVE.W #-56,D7
; BSR.S ADDLIBS2
RTS
ADDLIBS2: ; PAR: A5=LIB DATA, D7=OFFSET OF CUR. LIB.
MOVE.W #-30,D6 ; D6=OFFSET OF CUR. CALL
MOVE.L CURLIBASC,A4 ; A4=LIBSTRUCTS
JSR CHECK3
.XL:CMP.B #-1,(A5)
BEQ.S .OUT
MOVE.L A5,(A4)+ ; ptr to ascii
MOVE.W D7,(A4)+ ; xbase offset
MOVE.W D6,(A4)+ ; own offset
MOVE.W #-1,(A4)+ ; EXCEPTION INDEX
SUBQ.W #6,D6
.F: CMP.B #32,(A5)+ ; NOW GET TO THE NEXT
BPL .F
CMP.B #16,-1(A5)
BEQ.S .XL
.F2: TST.B (A5)
BMI.S .XL
CMP.B #16,(A5)
BPL.S .XL
ADDQ.L #1,A5
BRA.S .F2
.OUT: MOVE.L A4,CURLIBASC
CLR.L (A4)
CLR.L 4(A4)
CLR.L 8(A4)
RTS
;*-*
;; ParseObjectFile
PARSEOBJECTFILE:
; Gets start of "module" in D0,
; it's len in d1,
; it's real pos in d2
; and real len in d3
;
; d2 and d3 are for the binaries, when d0 and d1 are for plain text!!!
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L D0,A0 ;start
MOVe.L A0,A1
ADD.L D1,A1 ;end
move.l d2,a2
move.l a2,a3
add.l d3,a3 ;if not enough, raise error
.LOOP1:
CMP.L A1,A0
BPL .EXIT
moveq #0,d0
MOVE.B (A0)+,D0
BEQ .EXIT
CMP.b #" ",D0
BEQ .LOOP1
CMP.b #10,D0
BEQ .LOOP1
CMP.b #9,D0
BEQ .LOOP1
CMP.b #"/",D0
BEQ .TRYCOM
CMP.b #"-",D0
BEQ .TRYCOM2
CMP.b #"P",D0
BEQ .PROC
CMP.b #"I",D0
BEQ .INLINE
CMP.b #"S",D0
BEQ .STARTUPCODE
BRA ERROR88
.EXIT:
MOVEM.L (A7)+,D0-D7/A0-A6
RTS
;; parse /* */ //
.TRYCOM:
CMP.B #"/",(A0)
BEQ .SHORT
CMP.B #"*",(A0)
BNE ERROR88
.LOOP2:
CMPA.L A1,A0
BPL ERROR88
CMP.B #"*",(A0)+
BNE .LOOP2
CMP.B #"/",(A0)
BNE .LOOP2
ADDQ.L #1,A0
BRA .LOOP1
;*-*
;; parse ->
.TRYCOM2:
CMP.B #">",(A0)
BEQ .SHORT
BRA ERROR88
;*-*
;; do // ->
.SHORT:
CMPA.L A1,A0
BPL ERROR88
CMP.B #10,(A0)+
BNE .SHORT
BRA .LOOP1
;*-*
;; proc
.PROC:
MOVE.L A1,-(A7)
LEA .HEAVYTAB,A6
cmp.b #"R",(A0)+
Bne ERROR88
cmp.b #"O",(a0)+
bne ERROR88
cmp.b #"C",(a0)+
BNE ERROR88
BSR .SKIPWHITE
GETM A4
move.l a4,a5 ; a5 = name
move.b (a0)+,D0
MOVE.B D0,(A4)+
MOVE.B (A6,D0),D0
CMP.B #2,D0
BNE ERROR88
.LP:
MOVE.B (A0)+,D0
mOVE.b D0,(a4)+
TST.B (A6,D0)
BNE .LP
subq.l #1,a0
MOVE.B #0,-1(A4) ; NULL-TERMINATED NAME OF COMMAND
move.l a4,d0
btst #0,d0
beq .LS1
clr.b (a4)+
.LS1:
CLR.L (A4)+
move.l a5,LIB_NAME(a4) ;
BSR LIBCHASH
BSR .SKIPWHITE
CMP.b #"(",(A0)+
BNE ERROR88
MOVEQ #0,D5 ; NO OF ARGS
BSR .SKIPWHITE
MOVEQ #0,D0
MOVE.B (A0)+,D0
CMP.B #")",D0
BEQ .LX
SUBQ.L #1,A0
.NEXT:
BSR .SKIPWHITE
MOVE.L A0,D2
MOVE.B (A0)+,D0
TST.B (A6,D0)
BEQ ERROR88
ADDQ.L #1,D5
.LP3:
MOVE.B (A0)+,D0
TST.B (A6,D0)
BNE .LP3
subq.l #1,a0
BSR .SKIPWHITE
CMP.B #",",(A0)+
BEQ .NEXT
CMP.B #":",-1(A0)
BEQ .LY
CMP.B #")",-1(A0)
BNE ERROR88
BRA .LX
.LY:
LEA .STREAM(PC),A6
BSR .CHECK
NEG.L D5
bsr .SKIPWHITE
CMP.B #")",(A0)+
BNE ERROR88
.LX:
MOVE.W D5,LIB_ARGS(A4)
CLR.W LIB_TYPE(A4) ;type
clr.l LIB_CODE(a4)
CLR.L LIB_CLEN(A4)
CLR.L LIB_USED(A4) ;code-rel/use
CLR.W LIB_CPU(A4)
CLR.W LIB_FPU(A4)
CLR.W LIB_MMU(A4)
MOVE.W #33,LIB_OSVERS(A4)
BSR .FINDCODE
ADD.L #LIB_SIZE,A4
DONEM A4
MOVE.L (A7)+,A1
BRA .LOOP1
;*-*
;; inline
.INLINE:
MOVE.L A1,-(A7)
LEA .INL_NAME(PC),A6
BSR .CHECK
BSR .SKIPWHITE
LEA .HEAVYTAB(PC),A6
GETM A4
move.l a4,a5 ; a5 = name
move.b (a0)+,D0
MOVE.B D0,(A4)+
MOVE.B (A6,D0),D0
CMP.B #2,D0
BLT ERROR88
; movem.l d0-a6,-(A7)
; move.l a0,d2
; move.l #6,d3
; jsr WRITECON
; movem.l (a7)+,d0-a6
.INL_LP:
MOVE.B (A0)+,D0
mOVE.b D0,(a4)+
TST.B (A6,D0)
BNE .INL_LP
subq.l #1,a0
MOVE.B #0,-1(A4) ; NULL-TERMINATED NAME OF COMMAND
move.l a4,d0
btst #0,d0
beq .INL_LS1
clr.b (a4)+
.INL_LS1:
clr.l (a4)+
move.l a5,LIB_NAME(a4) ;
BSR LIBCHASH
BSR .SKIPWHITE
CMP.b #"(",(A0)+
BNE ERROR88
MOVEQ #0,D5 ; NO OF ARGS
BSR .SKIPWHITE
MOVEQ #0,D0
MOVE.B (A0)+,D0
CMP.B #")",D0
BEQ .INL_LX
SUBQ.L #1,A0
.INL_NEXT:
BSR .SKIPWHITE
MOVEQ #0,D2
MOVE.B (A0)+,D0
TST.B (A6,D0)
BEQ ERROR88
ADDQ.L #1,D5
.INL_LP3:
MOVE.B (A0)+,D0
TST.B (A6,D0)
BNE .INL_LP3
subq.l #1,a0
CMP.B #":",(A0)+
BNE ERROR88
MOVE.B (A0)+,D0
CMP.B #"A",D0
BNE .INL_SKXX1
ADDQ.L #4,D2
BRA .INL_SKXX2
.INL_SKXX1:
CMP.B #"D",D0
BNE ERROR88
.INL_SKXX2:
MOVE.B (A0)+,D0
CMP.B #"0",D0
BLT ERROR88
CMP.B #"3",D0
BGT ERROR88
SUB.L #"0",D0
AND.L #3,d0
add.b d0,d2
CMP.B #3,d2
beq ERROR88
move.b d2,LIB_TARR-1(a4,d5); Dx/Ax reg, e.g. INLINE Whatever(what:D0,where,A0)
BSR .SKIPWHITE
CMP.B #",",(A0)+
BEQ .INL_NEXT
CMP.B #")",-1(A0)
BNE ERROR88
.INL_LX:
MOVE.W D5,LIB_ARGS(A4)
MOVE.W #1,LIB_TYPE(A4) ; type
CLR.W LIB_CPU(A4)
CLR.W LIB_FPU(A4)
CLR.W LIB_MMU(A4)
mOVE.W #33,LIB_OSVERS(A4)
BSR .FINDCODE
CLR.L LIB_USED(A4) ;code-rel/use
ADD.L #LIB_SIZE,A4
DONEM A4
MOVE.L (A7)+,A1
BRA .LOOP1
;*-*
;; startup code
.STARTUPCODE:
MOVE.L A1,-(A7)
LEA .STC_NAME(PC),A6
BSR .CHECK
BSR .SKIPWHITE
LEA .HEAVYTAB(PC),A6
GETM A4
move.l a4,a5 ; a5 = name
move.b (a0)+,D0
MOVE.B D0,(A4)+
MOVE.B (A6,D0),D0
CMP.B #2,D0 ; only capital letters..
BNE ERROR88
.STC_LP:
MOVE.B (A0)+,D0
mOVE.b D0,(a4)+
CMP.B #2,(A6,D0) ; CAPITAL LETTERS ONLY
BEQ .STC_LP
subq.l #1,a0
MOVE.B #0,-1(A4) ; NULL-TERMINATED NAME OF CODE
move.l a4,d0
btst #0,d0
beq .STC_LS1
clr.b (a4)+
.STC_LS1:
move.l LIBLIST(PC),(A4)+
move.l A4,LIBLIST
move.l a5,LIB_NAME(a4) ;
BSR .SKIPWHITE
MOVE.W #0,LIB_ARGS(A4)
MOVE.W #2,LIB_TYPE(A4) ; type
BSR .FINDCODE
ADD.L #LIB_SIZE,A4
DONEM A4
MOVE.L (A7)+,A1
BRA .LOOP1
;*-*
;; Check
; A0 - src
; A6 - dest
.CHECK:
CMPM.B (A0)+,(A6)+
BEQ .CHECK
TST.B -1(A6)
BNE ERROR88
sUBQ.L #1,A0
CMP.B #32,(A0)
BEQ .CHX
CMP.B #")",(A0)
BEQ .CHX
CMP.B #9,(A0)
BNE ERROR88
.CHX:
RTS
;*-*
;; SKIP WHITESPACES
.SKIPWHITE
cmp.b #" ",(a0)+
beq .SKIPWHITE
cmp.b #9,-1(a0)
beq .SKIPWHITE
SUBQ.L #1,A0
RTS
;*-*
.HEAVYTAB:
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0
DC.B 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ; -O
DC.B 2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2 ; -_
DC.B 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ; -o
DC.B 3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0 ; -DEL
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DC.B 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.INL_NAME:
DC.B 'NLINE',0
.STC_NAME:
DC.B 'TARTUP',0
.STREAM:
DC.B 'STREAM',0
EVEN
;; code
;; FindCode
.FINDCODE
MOVEM.L D0-D7/A0-A1/A4-A6,-(A7)
CMPA.L A3,A2 ; check if enough code
BPL ERROR28 ;
cmp.l #$3e7,(a2) ; we're doing a link object
bne ERROR28 ; !
.LC1:
CMPA.L A3,A2
BPL ERROR28 ; file truncated?
MOVe.L (A2)+,D0
CMP.L #$3F2,D0
BEQ .X
MOVe.L (A2)+,D1 ; size of hunk/whatever
sub.l #$3e7,d0
lsl.w #2,d0
move.l .TABLE(PC,d0),A0
JSR (a0)
bra .LC1
.X: MOVEM.L (A7)+,D0-D7/A0-A1/a4-A6
RTS
;*-*
.TABLE:
DC.L .SKIP, .SKIP, .CODE, .ERRR, .ERRR, .RELO, .ERRR, .ERRR
DC.L .XTNS, .ERRR, .SKIP, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR
DC.L .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR, .ERRR
.CURRENT:
DC.L 0
;; code
.CODE:
LSL.L #2,D1
MOVE.L D1,LIB_CLEN(A4)
MOVE.L A2,LIB_CODE(A4)
CLR.L LIB_RELO(A4)
ADD.L D1,A2
RTS
;*-*
;; skip
.SKIP:
LSL.L #2,D1
ADD.L D1,A2
rTS
;*-*
;; extn
.XTNS:
MOVE.L A2,LIB_XTNS(A4)
SUB.L #4,LIB_XTNS(A4)
.EXTN:
MOVE.L d1,d2
beq .XIT
MOVE.L A2,A5
LOWER A2,D0
MOVe.L A5,A2
rol.l #8,d2
and.l #$FF,D2
and.l #$FFFFFF,d1
cmp.w #$83,d2
beq .0x83
cmp.w #$02,d2
beq .0x02
.EXT_1:
lsl.l #2,d1
add.l d1,a2
move.l (a2)+,d1
cmp.w #$80,d2
bmi .EXT_2
lsl.l #2,d1
add.l d1,a2
.EXT_2:
move.l (a2)+,d1
bra .EXTN
.XIT:
rts
;*-*
;; errr
.ERRR:
BRA ERROR28
;*-*
;; relo
.RELO:
SUBQ.L #8,A2 ;also reloc type!
MOVE.L A2,LIB_RELO(A4)
addq.l #2,d1
LSL.L #2,D1
ADD.L D1,A2
addq.l #8,a2 ; hunk 1 hunk 0
rTS
;*-*
;; 0xXX
;; 0x83:
.0x83:
MOVE.L A5,A2 ; dos base
MOVEQ #-44,D3
LEA .DBASE,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-48,D3 ; intuition base
MOVE.L A5,A2
LEA .IBASE,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-52,d3 ; gfx base
MOVE.L A5,A2
LEA .GBASE,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-8,d3 ; stdout
MOVE.L A5,A2
LEA .SOUT,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-16,d3 ; stdrast
MOVE.L A5,A2
LEA .SRAST,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-32,d3 ; arg
MOVE.L A5,A2
LEA .ARG,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-36,d3 ; wbmessage
MOVE.L A5,A2
LEA .WBMSG,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVEQ #-56,D3 ; mathieeesingbas base
MOVE.L A5,A2
LEA .SBBASE,A6
BSR .CHECK2
BNE .0x83_skp1
BSET #3,CODEPREFS+1
BRA .0x83_FILL
.0x83_skp1:
MOVEQ #-60,D3 ; mathieeesingtrans base
MOVE.L A5,A2
LEA .STBASE,A6
BSR .CHECK2
BNE .0x83_skp2
BSET #4,CODEPREFS+1
BRA .0x83_FILL
.0x83_skp2:
MOVE.L #-84,D3 ; exception
MOVE.L A5,A2
LEA .XCP,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVE.L #-96,D3 ; exceptioninfo
MOVE.L A5,A2
LEA .XCPI,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVE.L #-92,D3 ; stdin
MOVE.L A5,A2
LEA .SIN,A6
BSR .CHECK2
BEQ .0x83_FILL
MOVE.L #-120,D3 ; pool
MOVE.L A5,A2
LEA .POOL,A6
BSR .CHECK2
BNE .0x83_skp3
BSET #6,CODEPREFS
BRA .0x83_FILL
.0x83_skp3:
MOVE.L #-124,D3 ; utillib
MOVE.L A5,A2
LEA .UBASE,A6
BSR .CHECK2
BNE .0x83_skp4
BSET #7,CODEPREFS
BRA .0x83_FILL
.0x83_skp4:
CMP.W #2,LIB_TYPE(A4)
BEQ .0x83_skp5 ; startup code - additional fields below
BRA ERROR28
.0x83_skp5:
MOVE.L #0,D3
BRA .0x83_FILL
;; Fill
.0x83_FILL:
MOVE.L A5,A2
LSL.L #2,D1
ADD.L D1,A2
MOVE.L (A2)+,D1
SUBQ.L #1,D1
MOVE.L LIB_CODE(A4),A6
.0x83_DBLOOP:
MOVE.L (A2)+,D0
MOVE.W D3,(A6,D0.L)
DBF D1,.0x83_DBLOOP
MOVE.L (A2)+,D1
BRA .EXTN
;*-*
;*-*
;; 0x02:
.0x02:
MOVE.L #LIB_CPU,D2
MOVE.L A5,A2 ; cpu
MOVEQ #-44,D3
LEA .CPU,A6
BSR .CHECK2
BEQ .0x02_FILL
MOVE.L #LIB_FPU,D2
MOVE.L A5,A2 ; fpu
MOVEQ #-44,D3
LEA .FPU,A6
BSR .CHECK2
BEQ .0x02_FILL
MOVE.L #LIB_MMU,D2
MOVE.L A5,A2 ; mmu
MOVEQ #-44,D3
LEA .MMU,A6
BSR .CHECK2
BEQ .0x02_FILL
MOVE.L #LIB_OSVERS,D2
MOVE.L A5,A2 ; osversion
MOVEQ #-44,D3
LEA .OSV,A6
BSR .CHECK2
BEQ .0x02_FILL
BRA ERROR22
;; sub codes
.0x02_FILL:
lsl.l #2,d1
move.l a5,a2
add.l d1,a2
move.l (a2)+,d3
cmp.l #LIB_CPU,D2
beq .A
cmp.l #LIB_FPU,d2
beq .B_
cmp.l #LIB_MMU,D2
beq .C
move.w D3,(A4,D2)
._EXIT:
move.l (a2)+,d1
bra .EXTN
;; cpu
.A:
CMP.L #$68000,d3
bpl .A1
cmp.l #$10,d3
bpl .A2
MULU.W #20,D3
MOVE.W D3,(A4,D2)
BRA ._EXIT
.A2:
MOVE.W D3,(A4,D2)
BRA ._EXIT
.A1:
SUB.L #$68000,D3
MOVE.W D3,(A4,D2)
BRA ._EXIT
;*-*
;; fpu
.B_:
cMP.l #$68000,d3
bpl .B1
cmp.l #$040,d3
bpl .B2
move.w d3,(A4,D2)
bra ._EXIT
.B1:
cmp.l #$68881,d3
bpl .B11
move.w #2,(a4,d2)
bra ._EXIT
.B11:
move.w #1,(a4,d2)
bra ._EXIT
.B2:
cmp.l #$881,d3
bpl .B21
move.w #2,(a4,d2)
bra ._EXIT
.B21:
move.w #1,(a4,d2)
bra ._EXIT
;*-*
;; mmu
.C:
cmp.l #$68851,d3
beq .C1
move.w #2,(a4,d2)
bra ._EXIT
.C1:
move.w #1,(a4,d2)
bra ._EXIT
;*-*
;*-*
;*-*
;; Check2
; A2 - src
; A6 - dest
.CHECK2:
MOVEQ #1,D0
CMPM.B (A2)+,(A6)+
BNE .CH2X
TST.B -1(A2)
BNE .CHECK2
BNE .CH2X
MOVEQ #0,D0
.CH2X:
TST.L D0
RTS
;*-*
;; 0x83 names
.DBASE:
DC.B '_dosbase',0
.IBASE:
DC.B '_intuitionbase',0
.GBASE:
DC.B '_gfxbase',0
.SOUT:
DC.B '_stdout',0
.SRAST:
DC.B '_stdrast',0
.ARG:
DC.B '_arg',0
.WBMSG:
DC.B '_wbmessage',0
.SBBASE:
DC.B '_mathieeesingbasbase',0
.STBASE:
DC.B '_mathieeesingtransbase',0
.XCP:
DC.B '_exception',0
.XCPI:
Dc.B '_exceptioninfo',0
.SIN:
DC.B '_stdin',0
.UBASE:
DC.B '_utilitybase',0
.POOL:
DC.B '_pool',0
EVEN
;*-*
;; 0x02 names
.CPU:
DC.B '__cpu',0
.FPU:
DC.B '__fpu',0
.MMU:
DC.B '__mmu',0
.OSV:
DC.B '__osversion',0
;*-*
;*-*
;*-*
;; hash
LIBCHASH:
MOVEM.L D0-A6,-(A7)
MOVE.L #LIBHASH,A0 ; A0=TABLE
HASH A5,D0,D1
LSL.L #2,D0
LEA 0(A0,D0.L),A2
MOVE.L (A2),LIB_NEXT(A4) ; READ PREVIOUS LIST (OR NIL)
MOVE.L A4,(A2) ; PUT ENTRY IN LIST
MOVEM.L (A7)+,D0-A6
RTS
;*-*
LIBLIST:
DC.L 0
;*-*
;HEADER
;; Exec
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; The InitCode and ExitCode Part .... ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
STACKPOKE: DC.L 0,0
AFTERDELEGATESLEA: DC.L 0
BEFORESECONDLEA: DC.L 0
TOTALDELSIZE: DC.L 0
BUILDDELEGATECONSTRUCTORS:
MOVE.L CURACODE,A4 ; A4=CODE
MOVEQ #6,D0
JSR ADDLABEL
LEA OLIST+4,A5 ; A5=OLIST
MOVEQ #1,D6 ; D6=NUM
.CO: MOVE.L -(A5),D0
BEQ.S .COX
MOVE.L D0,A5
TST.W ODEL(A5)
BEQ.S .CO
ADDQ.L #1,D6
BRA.S .CO
.COX: LSL.L #2,D6
MOVEQ #4,D4 ; D4=CUR_DEL_PTR_OFF
LEA OLIST+4,A5 ; A5=OLIST
.XL:MOVE.L -(A5),D0
BEQ.W .X
MOVE.L D0,A5
MOVE.W ODEL(A5),D7 ; D7=DELSIZE
BEQ.S .XL
GETM A1
MOVE.L .GET(PC),(A4)+
MOVE.L D6,(A4)+
MOVE.W .GET2(PC),(A4)+
MOVE.L OACC(A5),(A1) ; ADD TO ACCESSLIST OF THIS OBJECT
MOVE.L A1,OACC(A5)
ADDQ.L #4,A1
MOVE.L A4,(A1)+
CLR.W (A1)+
DONEM A1
CLR.W (A4)+
EXT.L D7
MOVE.L ODCODE(A5),A3 ; A3=CODE
MOVE.L A3,D0
BEQ ERROR50
MOVE.L A3,D0
SUB.L A4,D0
CMP.L #-32000,D0
BMI .LL
SUBQ.L #2,D0
MOVE.W .BSR(PC),(A4)+
MOVE.W D0,(A4)+
BRA.S .LD
.LL: ADD.L A4,D0
SUB.L ACODE,D0
MOVE.W .JSR(PC),(A4)+
MOVE.L D0,D1
MOVE.L A4,D0
JSR ADDDIVRELOC
MOVE.L D1,(A4)+
.LD:
BSR .ACC
ADD.L D7,D6
ADDQ.L #4,D4
BRA.W .XL
.X: SUBQ.L #4,D6
MOVE.L D6,TOTALDELSIZE
BSR MATHINITETC
MOVE.W .RTS(PC),(A4)+
MOVE.L A4,CURACODE
JSR CHECK3
.RTS: RTS
.BSR: BSR .X
.JSR: JSR .X
.GET: MOVE.L A4,A0
ADD.L #1,A0
.GET2: MOVE.L A0,4(A4)
.ACC: LEA OACC(A5),A3
MOVE.L ODCODE(A5),D5
SUB.L ACODE,D5
.AL: MOVE.L (A3),D0
BEQ.S .AX
MOVE.L D0,A3
MOVE.L 4(A3),A2
MOVE.W 8(A3),D0
BNE.S .AA
MOVE.W D4,(A2)
BRA.S .AN
.AA: MOVE.L D5,(A2)
MOVE.L A2,D0
BSR ADDDIVRELOC
.AN: BRA.S .AL
.AX: RTS
MAKEEXITCODE:
MOVE.W #11,CURSPOT
BTST #3,CODEPREFS+3
BNE .EX
TSTMOD
BNE .EX
BTST #5,CODEPREFS
BNE .EX
BTST #2,CODEPREFS
BNE OTHEREXITCODE
BSR BUILDDELEGATECONSTRUCTORS
BSR BUILDLIBFUNS
MOVE.L TOTALDELSIZE(PC),D1 ; PATCH DELSIZE
MOVE.L D1,D2
MOVE.L BEFORESECONDLEA(PC),D0
BEQ.S .1
MOVE.L D0,A0
MOVE.L D2,2(A0)
.1: NEG.L D2
MOVE.L AFTERDELEGATESLEA(PC),A0
MOVE.L D2,-4(A0)
MOVE.L MINSTACK,D0 ; GLOBAL + ALL_LOCAL + DELEGATES
ADD.L GLOBSTACK,D0
ADD.L D1,D0
MOVE.L CODESTACK,D1
BNE.S .S
ADD.L #MINSTACKSIZE,D0
MOVE.L LIBINFO,D1
BEQ.S .NL
SUB.L #MINSTACKSIZE-MINSTACKSIZELIB,D0
.NL: MOVE.L D0,CODESTACK
BSET #0,CODEPREFS+3
BRA.S .NS
.S: CMP.L D0,D1
BPL.S .S2
BSET #2,WARNINGS+3
.S2: ADD.L #4000,D0
CMP.L D0,D1
BPL.S .S3
BSET #1,WARNINGS+3
BCLR #2,WARNINGS+3
.S3:
.NS: MOVE.L CODESTACK,D0
LEA STACKPOKE(PC),A0
MOVE.L (A0)+,A1
MOVE.L D0,(A1)
MOVE.L (A0),A1
MOVE.L D0,(A1)
.EX: RTS
MAKEINITCODE:
MOVE.W #3,CURSPOT
MOVE.L CURACODE,A4
GETM A0 ; fill the 0-hunk structure!
clr.l (a0)+ ; next
MOVE.L A0,HunkList ;
MOVE.L A4,(A0)+ ; start
MOVE.L #$3e9,(A0)+ ; type
clr.l (a0)+ ; end
clr.l (a0)+ ; prev
clr.l (a0)+ ; reloc
DONEM A0 ; We'll use it for writing the stuff :)
BTST #3,CODEPREFS+3
BNE .EX
TSTMOD
BNE .EX
BTST #5,CODEPREFS
BNE .EX
BTST #2,CODEPREFS
BNE OTHERINITCODE
TST.L LIBINFO
BNE LMAKEINITCODE
BTST #4,CODEPREFS
BNE NSMAKEINITCODE
BTST #4,ICODEPREFS+3
BEQ .nobg
BSR BGCODE
.nobg:
LEA FIRSTSTART(PC),A0 ; NEW STACK
MOVE.L (A0)+,(A4)+
MOVE.L (A0)+,(A4)+
MOVE.W (A0)+,(A4)+
MOVE.L A4,STACKPOKE
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #LINKC2,D0
BSR COPYC
MOVE.L A4,AFTERDELEGATESLEA ; PATCH IN SIZE LATER
MOVE.W LINKC2(PC),(A4)+
MOVE.W NRGLOB,D7
MOVE.W D7,(A4)+
LEA REALSTART(PC),A0
MOVE.L A4,A6 ; BACKUP
MOVE.L #MIDC,D0
BSR COPYC
LEA POKESTRING-REALSTART(A6),A6
MOVE.L ARGBYTE,A5
BTST #0,(A5)
BNE.S .ARGU
MOVE.L #$4E714E71,(A6)
MOVE.W #$4E71,4(A6)
.ARGU:
; BTST #0,CODEPREFS+2
; BEQ.S .NVERS
; MOVE.W OSVERSION,D0
; MOVE.B D0,POKE37-POKESTRING+1(A6)
.NVERS: MOVE.W GLOBJUMP(PC),(A4)+
MOVEQ #5,D0
JSR ADDBRANCHRELOC
MOVE.W EXITC(PC),(A4)+ ; DELEGATES
MOVEQ #8,D0
JSR ADDBRANCHRELOC
LEA EXITC2(PC),A0
MOVE.L #ENDC2,D0
BSR COPYC
LEA ENDC2(PC),A0
MOVE.L A4,BEFORESECONDLEA
MOVE.L (A0)+,(A4)+
MOVE.L (A0)+,(A4)+
MOVE.L A4,STACKPOKE+4
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #ST2,D0
BSR COPYC
MOVE.L ST2,(A4)+
TST.L bgName
BEQ .MICX
MOVE.L bgName(PC),A0
.MICC:
MOVE.B (A0)+,(A4)+
BNE .MICC
MOVE.L A4,D0
BTST #0,D0
BEQ .MICX
CLR.B (A4)+
.MICX:
BSR FIXPROCCODE
MOVE.L A4,CURACODE
.EX: RTS
MAINRTS: RTS
FIRSTSTART: ; CHANGES ALSO TO LFIRSTART!!!
MOVE.L 4.W,A6
MOVE.L A0,A5 ; SAVE A0/D0 TO A5/D7
MOVE.L D0,D7
MOVE.L #20000,D0 ; THIS .L IS CHANGED!
MOVE.L #$10000,D1
MOVE.L D0,D2
JSR -198(A6)
TST.L D0
BNE.S EXE_1
MOVEQ #20,D0
RTS
A4STORAGE_EXE:
DC.L 0
EXE_1:
MOVE.L D0,D6 ; D6=BOTTOMSTACK
ADD.L D2,D0
JSR -132(A6) ; --> FORBID
EXG.L D0,A7
MOVE.L D0,-(A7)
ADD.L #1,A7 ; SIZE IS PATCHED IN
LINKC2:
LINK A4,#-4
REALSTART:
JSR -138(A6) ; --> PERMIT
MOVE.L D6,-64(A4)
SUBA.L A1,A1 ; check for wbstartup
JSR -294(A6) ; findtasK
MOVE.L D0,A3
TST.L 172(A3)
BNE.S NOWBST
LEA 92(A3),A0
JSR -384(A6) ; waitport
LEA 92(A3),A0
JSR -372(A6) ; getmsg
MOVE.L D0,-36(A4)
LEA ZEROSPOT(PC),A0
MOVE.L A0,-32(A4) ; WB=NO ARGS
BRA.S NOARGSET
NOWBST:
MOVE.L A5,A0
MOVE.L D7,D0
MOVE.L A0,-32(A4)
POKESTRING:
MOVE.B #0,-1(A0,D0.W)
NOARGSET:
MOVE.L A6,-40(A4) ; INIT VARS
LEA EXITC(PC),A0
MOVE.L A0,-24(A4)
LEA INITINTUI(PC),A1 ; OPEN LIBS
POKE37:
MOVEQ #33,D0 ; OR V37!
JSR -552(A6)
MOVE.L D0,-48(A4)
BEQ CLINT
LEA INITGFX(PC),A1
MOVEQ #33,D0
JSR -552(A6)
MOVE.L D0,-52(A4)
BEQ CLGFX
LEA INITDOS(PC),A1
MOVEQ #33,D0 ; WE WILL USE FUNCTIONS NOT IN V32
JSR -552(A6)
MOVE.L D0,-44(A4)
BEQ CLDOS
MOVE.L D0,A6
JSR -60(A6) ; GET STDOUT, MAY BE 0
MOVE.L D0,-8(A4)
JSR -54(A6) ; GET STDIN
MOVE.L D0,-92(A4)
MOVE.L A7,-4(A4)
LEA A4STORAGE_EXE(PC),A1
MOVE.L A4,(A1)
BRA.S GLOBJUMP
INITDOS: DC.B "dos.library",0
INITINTUI: DC.B "intuition.library",0
INITGFX: DC.B "graphics.library",0
ZEROSPOT: DC.B 0
EVEN
MIDC:
GLOBJUMP:
JSR GLOBJUMP
EXITC:
JSR EXITC
EXITC2:
MOVE.L -4(A4),A7
MOVE.L 4.W,A6
MOVE.L -20(A4),A2 ; CLEANUP MEMORY
MOVE.L A2,D0
BEQ.S .3
.4: MOVE.L A2,A1
MOVE.L 4(A2),D0
MOVE.L (A2),A2
JSR -210(A6)
MOVE.L A2,D0
BNE.S .4
.3:
MOVE.L -44(A4),A1
JSR -414(A6) ; closedos
CLDOS: MOVE.L -52(A4),A1
JSR -414(A6) ; closegfx
CLGFX: MOVE.L -48(A4),A1
JSR -414(A6) ; closeintui
CLINT: MOVE.L -36(A4),D3
BEQ.S .1
JSR -132(A6) ; no unloadseg until we're done
MOVE.L D3,A1
JSR -378(A6) ; reply WB message
.1: MOVE.L -28(A4),D2 ; EXITCODE
UNLK A4
ENDC2:
ADD.L #1,A7
MOVE.L #$20000,D0
MOVE.L (A7)+,A1
EXG.L A1,A7
SUBA.L D0,A1
JSR -210(A6)
ST2:
MOVE.L D2,D0
RTS
ENDC:
;*-*
;; library
; sample.library
VERSION = 37
REVISION = 1
LIBB_DELEXP = 3
LIB_NEGSIZE = $10
LIB_POSSIZE = $12
LIB_OPENCNT = $20
TASKTABSIZE = 16
NUMTASKTAB = 8
NUMTASKS = TASKTABSIZE*NUMTASKTAB
TASKTABSTOREMASK = %1110000000 ; 16*8BYTES=128=7BIT CLEAR
sb_Flags = 34 ; LIB_SIZE
sb_pad = 35
sb_SysLib = 36
sb_DosLib = 40
sb_SegList = 44
sb_TASKS = 48 ; TASKID+A4
SampleBase_SIZEOF = NUMTASKS*8+sb_TASKS
Remove = -$FC
FreeMem = -$D2
PoolSize = 256*10+4 ; 256 places for [task:LONG,a4:LONG,open:INT]+4bytes for link
Start: MOVEQ #-1,d0
rts
RomTag: DC.W $4AFC ; UWORD RT_MATCHWORD
DC.L RomTag-Start ; APTR RT_MATCHTAG [R]
DC.L EndCode-Start ; APTR RT_ENDSKIP [R]
DC.B $80 ; UBYTE RT_FLAGS
DC.B VERSION ; UBYTE RT_VERSION
DC.B 9 ; UBYTE RT_TYPE
DC.B 0 ; BYTE RT_PRI
DC.L LibName-Start ; APTR RT_NAME [R]
DC.L IDString-Start ; APTR RT_IDSTRING [R]
DC.L InitTable-Start ; APTR RT_INIT table for InitResident()
InitTable:
DC.L 34+10;SampleBase_SIZEOF ; size of library base data space
DC.L 0 ; pointer to function initializers
DC.L dataTable-Start ; pointer to data initializers
DC.L initRoutine-Start ; routine to run
dataTable:
DC.W -$5FF8
DC.B $9,0
DC.W -$7FF6
DC.L LibName-Start
DC.W -$5FF2,$600,-$6FEC,VERSION,-$6FEA,REVISION,-$7FE8
DC.L IDString-Start,0
;; init
initRoutine:
movem.l a1/a5,-(sp)
move.l d0,a5
PatchLib1:
LEA 34(A5),A1
bset #0,9(a1)
MOVE.L A0,(A1) ; seg list
CLR.L 4(A1) ; task list
move.l a5,d0
movem.l (sp)+,a1/a5
rts
;*-*
;; open
Open:
addq.w #1,LIB_OPENCNT(A6) ; ( libptr:a6, version:d0 )
BSR.W GETTC
CMPA.L #0,A0
BNE .EXIT
BSR NEWTC
BRA .OKAY
.FAIL:
SUBQ.W #1,LIB_OPENCNT(A6) ;
MOVEQ #0,D0 ; AAARGH!!! ERROR!!
RTS
.OKAY:
MOVEM.L D2-D7/A0/A2-A6,-(A7)
MOVE.L A0,A5 ; AO POS BEWAREN OM A4 ..
BSR LFIRSTSTART
MOVEM.L (A7)+,D2-D7/A0/A2-A6
TST.L D0
BEQ.S .FAIL
.EXIT:
ADD.W #1,4(A0)
move.l a6,d0
rts
;*-*
;; close
Close:
BSR GETTC
CMPA.L #0,A0
BEQ .1
SUB.W #1,4(A0)
MOVEQ #0,D0
TST.W 4(A0)
BNE .1
MOVEM.L D2-D7/A2-A6,-(A7)
MOVE.L (A0),A4
CLR.L (A0)
CLR.L -(A0) ; change is multitask safe
BSR LEXITC
MOVEM.L (A7)+,D2-D7/A2-A6
moveq #0,d0 ; ( libptr:a6 )
subq.w #1,LIB_OPENCNT(a6)
bne.s .1
bsr Expung
.1: rts
;*-*
;; Expunge
Expung:
movem.l d2/d7/a4/a5/a6,-(sp) ; ( libptr: a6 )
PatchLib2:
LEA 34(a6),a4
move.l a6,a5
tst.w LIB_OPENCNT(a5)
bne.s .00 ; not closed yet
btst #0,9(a4) ; avoid self-expunge
beq.s .1
bclr #0,9(a4)
.00:moveq #0,d0 ;
bra.s ExpEnd ;
.1: move.l (a4),d7 ; seg list
MOVE.L $4,A6
move.l 4(a4),a4
.L1:MOVE.L A4,a1
move.l (a1),a4
move.l #PoolSize,D0
JSR -210(a6) ; free mem
cmpa.l #0,a4
bne .L1
move.l a5,a1 ; library
jsr Remove(A6) ; remove
moveq #0,d0 ;
move.l a5,a1 ;
move.w LIB_NEGSIZE(a5),d0
sub.l d0,a1
add.w LIB_POSSIZE(a5),d0
jsr FreeMem(A6) ; free library extra fields
move.l d7,d0
ExpEnd:
movem.l (sp)+,d2/d7/a4/a5/a6 ; bye
rts
;*-*
Null: moveq #0,d0
rts
;; GETTC
GETTC:
LEA 38(a6),a0
move.l (a0),a0
MOVE.L 4.W,A1 ; COPY IN GETA4!!!!!!!!
MOVE.L 276(A1),d0 ; A1=THISTASK
.L1:
cmpa.l #0,a0
BEQ .LX
move.l a0,a1 ; current
move.l (a1),a0 ; next
addq.l #8,a1
move.l #255,d1
.L2:
cmp.l -4(a1),d0
beq .X
lea 10(a1),a1
dbf d1,.L2
BRA .L1
.LX:rts
.X: MOVE.L A1,A0
RTS
;*-*
;; NEWTC
NEWTC:
LEA 38(a6),a0
move.l (a0),a0
move.l $4.W,A1
MOVE.L 276(a1),d0
.L1:
cmpa.l #$0,A0
BEQ .LX
move.l a0,a1 ; current
move.l (a1),a0 ; next
addq.l #8,a1
move.l #255,d1
.L2:
tst.l -4(a1)
beq PatchLibX
lea 10(a1),a1
dbf d1,.L2
bra .L1
.LX:
movem.l d0/a6,-(a7)
move.l $4.W,A6
move.l #PoolSize,D0
move.l #$10001,d1
jsr -198(a6)
move.l d0,a0
movem.l (a7)+,d0/a6
PatchLib3:
lea 38(a6),a1
move.l (a1),(a0)
move.l a0,(a1)
addq.l #8,a0
move.l d0,-4(a0)
rts
PatchLibX:
MOVE.L A1,A0
move.l d0,-4(a0)
RTS
;*-*
EndCode:
; same thing, only now for libraries
LFIRSTSTART: ; a5 here = ptr to put a4 in
MOVE.L A7,A3 ; A3 = ORIG STACK
MOVE.L 4.W,A6
MOVE.L #20000,D0 ; THIS .L IS CHANGED!
MOVE.L #$10000,D1
MOVE.L D0,D2
JSR -198(A6)
TST.L D0
BEQ.W LNOMEM
MOVE.L D0,D6 ; D6=BOTTOMSTACK
ADD.L D2,D0
JSR -132(A6) ; --> FORBID
MOVE.L D0,A7
ADD.L #1,A7 ; SIZE IS PATCHED IN
LLINKC2:
LINK A4,#-4
LREALSTART:
JSR -138(A6) ; --> PERMIT
MOVE.L A3,-4(A4)
MOVE.L D6,-64(A4)
MOVE.L A6,-40(A4) ; INIT VARS
LEA LINITINTUI(PC),A1 ; OPEN LIBS
LPOKE37:
MOVEQ #33,D0 ; OR V37!
JSR -552(A6)
MOVE.L D0,-48(A4)
BEQ LCLINT
LEA LINITGFX(PC),A1
MOVEQ #33,D0
JSR -552(A6)
MOVE.L D0,-52(A4)
BEQ LCLGFX
LEA LINITDOS(PC),A1
MOVEQ #33,D0 ; WE WILL USE FUNCTIONS NOT IN V32
JSR -552(A6)
MOVE.L D0,-44(A4)
BEQ LCLDOS
MOVE.L A4,(A5) ; PUT A4 IN TABLE
BRA.S LGLOBJUMP
LINITDOS: DC.B "dos.library",0
LINITINTUI: DC.B "intuition.library",0
LINITGFX: DC.B "graphics.library",0
LZEROSPOT: DC.B 0
EVEN
LMIDC:
LGLOBJUMP:
JMP LGLOBJUMP
LNOMEM:
LRTS:
RTS
LEXITC: ; START OF CLOSE, A4=A4
JSR LEXITC
LEXITC3:
JSR LRTS
LEXITC2:
MOVE.L A7,-4(A4)
MOVE.L 4.W,A6
MOVE.L -20(A4),A2 ; CLEANUP MEMORY
MOVE.L A2,D0
BEQ.S .3
.4: MOVE.L A2,A1
MOVE.L 4(A2),D0
MOVE.L (A2),A2
JSR -210(A6)
MOVE.L A2,D0
BNE.S .4
.3: MOVE.L -44(A4),A1
JSR -414(A6) ; closedos
LCLDOS: MOVE.L -52(A4),A1
JSR -414(A6) ; closegfx
LCLGFX: MOVE.L -48(A4),A1
JSR -414(A6) ; closeintui
LCLINT:
LENDC2:
MOVE.L #$20000,D0
MOVE.L -64(A4),A1
MOVE.L -4(A4),A7
JSR -210(A6)
MOVEQ #0,D0 ; FAIL (OPEN ONLY)
RTS
LENDC:
LibName:
IDString:
ENDFUNTAB:
COPYC: ; A0=START,D0=END,A4=DEST
SUB.L A0,D0
LSR.L #1,D0
SUBQ.L #1,D0
.1: MOVE.W (A0)+,(A4)+
DBRA D0,.1
RTS
COPYRELOC:
MOVE.L A4,D0
MOVE.L (A0)+,(A4)+
BSR ADDDIVRELOC
RTS
LMAKEINITCODE:
MOVE.L LIBINFO,A6 ; A6=LIBINFO
MOVE.L 12(A6),D2
SUB.L (A6),D2
LEA Start(PC),A0
MOVE.L (A0)+,(A4)+
MOVE.W (A0)+,(A4)+
BSR.S COPYRELOC ; MATCHTAG
BSR.S COPYRELOC ; ENDSKIP
MOVE.B (A0)+,(A4)+
ADDQ.L #1,A0
MOVE.B 7(A6),(A4)+ ; VERSION
MOVE.W (A0)+,(A4)+
BSR.S COPYRELOC ; LIBNAME
BSR.S COPYRELOC ; IDSTRING
ADD.L D2,-4(A4)
BSR.S COPYRELOC ; INIT
MOVE.L (A0)+,(A4)+
MOVE.L A4,FUNTABADR
ADDQ.L #4,A0
CLR.L (A4)+ ; FUN INIT
BSR.S COPYRELOC ; DATA INIT
BSR.S COPYRELOC ; RUN
MOVE.L (A0)+,(A4)+
MOVE.W (A0)+,(A4)+
BSR.S COPYRELOC ; LIBNAME
MOVE.L (A0)+,(A4)+
MOVE.W (A0)+,(A4)+
ADDQ.L #2,A0
MOVE.W 6(A6),(A4)+ ; VERSION
MOVE.W (A0)+,(A4)+
ADDQ.L #2,A0
MOVE.W 10(A6),(A4)+ ; REVISION
MOVE.W (A0)+,(A4)+
BSR.S COPYRELOC ; IDSTRING
ADDQ.L #4,A0
CLR.L (A4)+
ADD.L D2,-4(A4)
MOVE.L #EndCode,D0
BSR.S COPYC
LEA LFIRSTSTART(PC),A0 ; NEW STACK
MOVE.L (A0)+,(A4)+
MOVE.L (A0)+,(A4)+
MOVE.L A4,STACKPOKE
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #LLINKC2,D0
BSR.W COPYC
MOVE.L A4,AFTERDELEGATESLEA ; PATCH IN SIZE LATER
MOVE.W LLINKC2(PC),(A4)+
MOVE.W NRGLOB,D7
MOVE.W D7,(A4)+
LEA LREALSTART(PC),A0
MOVE.L A4,A6 ; BACKUP
MOVE.L #LMIDC,D0
BSR.W COPYC
; BTST #0,CODEPREFS+2
; BEQ.S .NVERS
; LEA LPOKE37-LMIDC+1(A4),A6
; MOVE.W OSVERSION,D0
; MOVE.B D0,(A6)
.NVERS: LEA LGLOBJUMP(PC),A2
MOVE.W (A2),(A4)+
MOVEQ #5,D0
JSR ADDBRANCHRELOC
MOVE.W 6(A2),(A4)+
MOVE.W LEXITC(PC),(A4)+ ; DELEGATES
MOVEQ #8,D0
JSR ADDBRANCHRELOC
MOVE.W LEXITC3(PC),(A4)+ ; this bit links in close()
MOVEM.L D3-D4/A1-A3,-(A7)
LEA .CLOSE(PC),A3
HASH A3,D3,D4
LEA IDENTHASH,A3
LSL.L #2,D3
ADD.L D3,A3
ADDQ.L #4,A3
.CL: MOVE.L -(A3),A3 ; A3=IDENT
MOVE.L A3,D4
BEQ.S .NF
MOVE.L (A3),A2
LEA .CLOSE(PC),A1
.IL: CMPM.B (A2)+,(A1)+
BNE.S .CL
TST.B -1(A2)
BNE.S .IL
CMPI.B #LAB,4(A3)
BNE.S .CL
MOVE.L 6(A3),D4 ; NO LABELS
BEQ.S .CL
MOVE.L D4,A2 ; A2=PROC
BTST #1,2(A2)
BNE ERROR70 ; NO METHODS
TST.W (A2)
BNE ERROR70 ; NO ARGS
BSET #0,5(A3)
MOVE.W 10(A3),D0
JSR ADDBRANCHRELOC
BRA.S .CN
.CLOSE: DC.B "close",0
.NF: MOVE.L A4,D0
BSR ADDDIVRELOC
MOVE.L A4,D3
SUB.L #LEXITC3-LRTS+2,D3
SUB.L ACODE,D3
MOVE.L D3,(A4)+
.CN: MOVEM.L (A7)+,D3-D4/A1-A3
LEA LEXITC2(PC),A0
MOVE.L #LENDC2,D0
BSR COPYC
LEA LENDC2(PC),A0
MOVE.W (A0)+,(A4)+
MOVE.L A4,STACKPOKE+4
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #LENDC,D0
BSR COPYC
MOVE.L LIBINFO,A6
MOVE.L (A6),A0
.1: MOVE.B (A0)+,(A4)+
BNE.S .1
MOVE.L 12(A6),A0
.2: MOVE.B (A0)+,(A4)+
BNE.S .2
MOVE.L A4,D0
BTST #0,D0
BEQ.S .3
CLR.B (A4)+
.3: BSR FIXPROCCODE
MOVE.L A4,CURACODE
RTS
FUNTABADR: DC.L 0
funcTable:
dc.l Open-Start
dc.l Close-Start
dc.l Expung-Start
dc.l Null-Start
;; GETA4
GETA4:
MOVEM.L D0/D1/A0/A1,-(A7)
LEA 38(a6),a0
move.l (a0),a0
MOVE.L 4.W,A1 ; COPY IN GETA4!!!!!!!!
MOVE.L 276(A1),d0 ; A1=THISTASK
.L1:
move.l a0,a1 ; current
move.l (a1),a0 ; next
addq.l #8,a1
move.l #255,d1
.L2:
cmp.l -4(a1),d0
beq .X
lea 10(a1),a1
dbf d1,.L2
cmpa.l #0,a0
bne .L1
suba.l a4,a4 ; not found
rts
.X: MOVE.L (A1),A4
MOVEM.L (A7)+,D0/D1/A0/A1
RTS
ENDGETA4:
;*-*
BUILDLIBFUNS:
MOVE.L LIBINFO,D6
BEQ.W .X
MOVE.L D6,A6 ; A6 = LIBINFO
MOVE.L CURACODE,A4 ; A4 = CODE
MOVE.L FUNTABADR(PC),A5
MOVE.L A4,D0
SUB.L ACODE,D0
MOVE.L D0,(A5)
MOVE.L A5,D0
BSR ADDDIVRELOC
LEA funcTable(PC),A0
BSR COPYRELOC
BSR COPYRELOC
BSR COPYRELOC
BSR COPYRELOC
MOVE.L A4,A2 ; A2 = LIBTAB
MOVE.W 18(A6),D0
LSL.W #2,D0
ADD.W D0,A4
MOVE.L #-1,(A4)+
MOVE.L A4,D7 ; D7 = GETA4ADDR
LEA GETA4(PC),A0
MOVE.L #ENDGETA4,D0
BSR COPYC
LEA 20(A6),A6 ; A6 = FUNTAB
.XL:MOVE.L (A6)+,D0
BEQ.W .C
ADD.W #20-4,A6
MOVE.L D0,A5 ; A5 = IDENT
CMP.B #LAB,4(A5)
BNE ERROR70
BTST #4,5(A5)
BNE ERROR70
MOVE.L 6(A5),D0
BEQ ERROR70
MOVE.L D0,A3 ; A3 = PROC
TST.L 10(A3)
BNE ERROR70
MOVE.L A2,D0
BSR ADDDIVRELOC
MOVE.L A4,D0
SUB.L ACODE,D0
MOVE.L D0,(A2)+
MOVE.L .M1(PC),(A4)+
MOVE.W -2(A6),D4
BMI.S .NS
CMP.W (A3),D4 ; BOTH LIBFUN DECLS NARGS
BNE ERROR70
.NS: MOVE.W (A3),D4
BEQ.W .R
CMP.W #13,D4
BPL ERROR70
TST.W -4(A6)
BMI.S .NS2
MOVEM.L D0/D1/A0,-(A7)
LEA -16(A6),A0
MOVE.W -2(A6),D0
SUBQ.W #1,D0
MOVEQ #0,D1
.RML: MOVE.B (A0)+,D1
MOVE.W .MV1(PC),(A4)
OR.W D1,(A4)+
DBRA D0,.RML
MOVEM.L (A7)+,D0/D1/A0
BRA.S .R
.NS2: CMP.W #1,D4
BEQ.W .ONE
SUBQ.W #2,D4
LSL.W #1,D4
MOVE.W .M1(PC),(A4)+
MOVE.W .TAB(PC,D4.W),(A4)+
.R: MOVE.W .BSR(PC),(A4)+ ; 2XENTRY
MOVE.L D7,D0
SUB.L A4,D0
MOVE.W D0,(A4)+
MOVE.W 10(A5),D0
MOVE.W .JSR(PC),NEWOP
MOVE.L .BSR(PC),(A4)+
JSR ADDBRANCH
MOVE.W (A3),D4
BEQ.S .R2
CMP.W #1,D4
BEQ.S .ONEA
CMP.W #2,D4
BEQ.S .TWOA
LSL.W #2,D4
MOVE.W .LEA(PC),(A4)+
MOVE.W D4,(A4)+
.R2: MOVE.L .M2(PC),(A4)+
MOVE.W .RTS(PC),(A4)+
BRA.W .XL
.C: MOVE.L A4,CURACODE
.X: RTS
.TAB: DC.W %1000000010000000 ; 2
DC.W %1100000010000000 ; 3
DC.W %1100000011000000 ; 4
DC.W %1110000011000000 ; 5
DC.W %1110000011100000 ; 6
DC.W %1111000011100000 ; 7
DC.W %1111000011110000 ; 8
DC.W %1111100011110000 ; 9
DC.W %1111110011110000 ; 10
DC.W %1111111011110000 ; 11
DC.W %1111111111110000 ; 12
.M1: MOVEM.L D2/A2-A6,-(A7)
.M2: MOVEM.L (A7)+,D2/A2-A6
.MV1: MOVE.L D0,-(A7)
.RTS: RTS
.BSR: BSR .X
.JSR: JSR .X
.LEA: LEA 4(A7),A7
.ADD1: ADDQ.L #4,A7
.ADD2: ADDQ.L #8,A7
.ONE: MOVE.W .MV1(PC),(A4)+
BRA.W .R
.ONEA: MOVE.W .ADD1(PC),(A4)+
BRA.S .R2
.TWOA: MOVE.W .ADD2(PC),(A4)+
BRA.S .R2
WRITELIBMOD:
MOVE.L LIBINFO,D0
BEQ.W .X
MOVE.L D0,A5 ; A5=LIBINFO
MOVE.L (A5),D1 ; D1/A2=LIBNAME
MOVE.L D1,A2
MOVE.L D1,A3 ; A3=DOTLOCATION
.XL:TST.B (A3)
BEQ.S .F
CMP.B #".",(A3)+
BNE.S .XL
.F: MOVE.B #"m",(A3)+
CLR.B (A3)+
MOVE.L D1,D0
JSR FLUSHMODULE
MOVE.L #1006,D2
MOVE.L DOSBASE,A6
JSR -30(A6)
MOVE.L D0,HANDLE
BEQ ERROR17
CLR.B 1(A3)
MOVE.B #"e",(A3)
MOVE.B #"s",-(A3)
MOVE.B #"a",-(A3)
MOVE.B #"b",-(A3)
MOVE.L #ESTACKBUF,A4 ; A4=BUF,D4=BEGIN
MOVE.L A4,D4
MOVE.L #"EMOD",(A4)+
MOVE.W #6,(A4)+
CLR.B (A4)+
.BL: MOVE.B (A2)+,(A4)+
BNE.S .BL
LEA 20(A5),A5
.NL: MOVE.L (A5)+,D0
BEQ.W .FL
ADD.W #20-4,A5
MOVE.L D0,A3 ; A3=IDENT
MOVE.L (A3),A2
MOVE.B (A2)+,D0
CMP.B #"a",D0
BPL.W .UP
.UPB: MOVE.B D0,(A4)+
.CL: MOVE.B (A2)+,(A4)+
BNE.S .CL
SUBQ.L #1,A4
MOVE.L 6(A3),A3 ; A3=PROC
MOVE.W (A3),D0
BEQ.W .NRG
TST.W -2(A5)
BMI.S .NRA
LEA -16(A5),A3
SUBQ.L #1,D0
.CRA: MOVE.B (A3)+,(A4)+
DBRA D0,.CRA
BRA.S .NRGB
.NRA: MOVE.W D0,D1
MOVEQ #0,D2
LSR.W #1,D1
TST.W D1
BEQ.S .DR
CMP.W #5,D1
BMI.S .AR
MOVEQ #4,D1
.AR: MOVE.W D1,D2
SUBQ.W #1,D1
.ARL: MOVE.B D1,D3
ADD.B #8,D3
MOVE.B D3,(A4)+
DBRA D1,.ARL
.DR: SUB.W D2,D0
SUBQ.W #1,D0
.DRL: MOVE.B D0,(A4)+
DBRA D0,.DRL
.NRGB: CHESTB A4,D0,3,ERROR37
BRA.W .NL
.FL: MOVE.B #-1,(A4)+
MOVE.L A4,D3
MOVE.L D4,D2
SUB.L D2,D3
JSR WRITEFILE
MOVE.L DOSBASE,A6
MOVE.L HANDLE,D1
JSR -36(A6)
.X: RTS
.UP: CMP.B #"z"+1,D0
BPL.W .UPB
SUB.B #32,D0
BRA.W .UPB
.NRG: MOVE.B #16,(A4)+
BRA.S .NRGB
;*-*
;; Nostartup
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; and again mit kein startup routines
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
NSMAKEINITCODE:
MOVE.W #3,CURSPOT
MOVE.L CURACODE,A4
BTST #3,CODEPREFS+3
BNE .EX
TSTMOD
BNE .EX
LEA NSFIRSTSTART(PC),A0 ; NEW STACK
MOVE.L (A0)+,(A4)+
MOVE.L (A0)+,(A4)+
MOVE.W (A0)+,(A4)+
MOVE.L A4,STACKPOKE
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #NSLINKC2,D0
BSR COPYC
MOVE.L A4,AFTERDELEGATESLEA ; PATCH IN SIZE LATER
MOVE.W NSLINKC2(PC),(A4)+
MOVE.W NRGLOB,D7
MOVE.W D7,(A4)+
LEA NSREALSTART(PC),A0
MOVE.L A4,A6 ; BACKUP
MOVE.L #NSMIDC,D0
BSR COPYC
MOVE.W NSGLOBJUMP(PC),(A4)+
MOVEQ #5,D0
JSR ADDBRANCHRELOC
MOVE.W NSEXITC(PC),(A4)+ ; DELEGATES
MOVEQ #8,D0
JSR ADDBRANCHRELOC
LEA NSEXITC2(PC),A0
MOVE.L #NSENDC2,D0
BSR COPYC
LEA NSENDC2(PC),A0
MOVE.L A4,BEFORESECONDLEA
MOVE.L (A0)+,(A4)+
MOVE.L (A0)+,(A4)+
MOVE.L A4,STACKPOKE+4
ADDQ.L #4,A4
ADDQ.L #4,A0
MOVE.L #NSST2,D0
BSR COPYC
MOVE.L NSST2,(A4)+
BSR FIXPROCCODE
MOVE.L A4,CURACODE
.EX: RTS
NSFIRSTSTART: ; CHANGES ALSO TO LFIRSTART!!!
MOVE.L 4.W,A6
MOVE.L A0,A5 ; SAVE A0/D0 TO A5/D7
MOVE.L D0,D7
MOVE.L #20000,D0 ; THIS .L IS CHANGED!
MOVE.L #$10000,D1
MOVE.L D0,D2
JSR -198(A6)
TST.L D0
BNE.S NOST_1
MOVEQ #20,D0 ; NO FUCKIN' MEM !
RTS
A4STORAGE_NOST:
DC.L 0
NOST_1:
MOVE.L D0,D6 ; D6=BOTTOMSTACK
ADD.L D2,D0
JSR -132(A6) ; --> FORBID
EXG.L D0,A7
MOVE.L D0,-(A7)
ADD.L #1,A7 ; SIZE IS PATCHED IN
NSLINKC2:
LINK A4,#-4
NSREALSTART:
JSR -138(A6) ; --> PERMIT
MOVE.L D6,-64(A4)
MOVE.L A6,-40(a4)
MOVE.L A7,-4(A4)
LEA A4STORAGE_NOST(PC),A1
MOVE.L A4,(A1)
NSMIDC:
NSGLOBJUMP:
JSR NSGLOBJUMP
NSEXITC:
JSR NSEXITC
NSEXITC2:
MOVE.L -4(A4),A7
MOVE.L 4.W,A6
MOVE.L -20(A4),A2 ; CLEANUP MEMORY
MOVE.L A2,D0
BEQ.S .3
.4: MOVE.L A2,A1
MOVE.L 4(A2),D0
MOVE.L (A2),A2
JSR -210(A6)
MOVE.L A2,D0
BNE.S .4
.3:
MOVE.L -28(A4),D2 ; EXITCODE
UNLK A4
NSENDC2:
ADD.L #1,A7
MOVE.L #$20000,D0
MOVE.L (A7)+,A1
EXG.L A1,A7
SUBA.L D0,A1
JSR -210(A6)
NSST2:
MOVE.L D2,D0
RTS
NSENDC:
;*-*
;; Other!
OTHEREXITCODE:
MOVE.W #11,CURSPOT
BSR BUILDDELEGATECONSTRUCTORS
; BSR FIXSTARTUPCODE
RTS
OTHERINITCODE:
MOVEM.L D0-A6,-(A7)
LEA STCNAME,A0
LEA LIBLIST+4,A1
.L1:
MOVe.L A0,A3
MOVE.L LIB_NEXT(A1),D0
BEQ ERROR42
MOVE.L D0,A1
CMP.W #2,LIB_TYPE(A1)
BNE .L1
MOVE.L LIB_NAME(A1),A2
.L2:
CMP.B (A2)+,(A3)+
BNE .L1
TST.B -1(A3)
BNE .L2
MOVE.L LIB_CODE(A1),STARTUP_CODE
MOVE.L LIB_CLEN(A1),STARTUP_SIZE
MOVE.L LIB_XTNS(A1),STARTUP_XTNS
MOVE.L A1,STARTUP_NODE
MOVEM.L (A7)+,D0-A6
MOVE.L CURACODE,A4
MOVE.L A4,A6
MOVEM.L D0-A3,-(A7)
BTST #4,ICODEPREFS+3
BEQ .z
BSR BGCODE
.z:
MOVEM.L (A7)+,D0-A3
MOVE.L A4,CURACODE
MOVE.L STARTUP_CODE,A0
MOVE.L STARTUP_SIZE,D0
LSR.W #1,D0
SUBQ.L #1,D0
.LOOP:
MOVE.W (A0)+,(A4)+
DBF D0,.LOOP
BSR FIXSTARTUPCODE2
BSR FIXPROCCODE
MOVEM.L A0/A6,-(A7)
MOVE.L CURACODE,A6
MOVE.L STARTUP_NODE,A0
BSR FIXRELOC
MOVEM.L (A7)+,A0/A6
MOVE.L A4,CURACODE
RTS
IFEQ 1
;; FIXSTARTUPCODE
FIXSTARTUPCODE:
MOVEM.L D0-A6,-(A7)
MOVE.L CURACODE,A0
MOVE.L STARTUP_XTNS,A1
.X_LOOP:
MOVE.L (A1)+,D0
BNE.S .X_CONT
MOVEM.L (A7)+,D0-A6
RTS
.X_CONT:
MOVE.L D0,D1
ROL.L #8,D1
AND.L #255,D1
AND.L #$FFFFFF,D0
MOVE.L A1,A5
LOWER2 A1,D2
MOVE.L A5,A1
CMP.W #$81,D1
BEQ .x81
CMP.W #$83,D1
BEQ .x83
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D0
CMP.W #$80,D1
BMI .X_LOOP
LSL.L #2,D0
ADD.L D0,A0
BRA .X_LOOP
;; Check
.CHECKNAME:
MOVE.L A1,-(A7)
MOVEQ #0,D2
.CHECKTST:
CMPM.B (A1)+,(A2)+
BNE .CHECKF
TST.B -1(A1)
BNE .CHECKTST
MOVEQ #-1,D2
.CHECKF:
MOVE.L (A7)+,A1
RTS
;*-*
;; 0x81
.x81:
LEA ._SETUP(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_SETUP
LEA ._DELMEM(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_DELMEM
LEA ._STKSIZE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_STKSIZE
MOVEQ #0,D1
MOVE.W OSVERSION,D1
LEA .OSVERSION(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_FILL
MOVE.W ASMCPU,D1
LEA .CPUFLAGS(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_FILL
LEA ._CLEANUP(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_CLEANUP
CLR.W ERRWHERE
BRA ERROR42
;; names
._SETUP:
DC.B '_setup',0
._CLEANUP:
DC.B '_cleanup',0
._DELMEM:
DC.B '_delmem',0
._STKSIZE:
DC.B '_stksize',0
EVEN
;*-*
;; subcodes
;; Fill
.x81_FILL:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_FILL_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L D1,(A4)
DBF D2,.x81_FILL_LOOP
BRA .X_LOOP
;*-*
;; SETUP
.x81_SETUP:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_SETUP_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVEQ #5,D0
MOVEm.L D1/A0,-(A7)
JSR ADDBRANCHRELOC
MOVEm.L (a7)+,d1/a0
DBF D2,.x81_SETUP_LOOP
BRA .X_LOOP
;*-*
;; CLEANUP
.x81_CLEANUP:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
BSET #6,ICODEPREFS+3
.x81_CLEANUP_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVEQ #8,D0
MOVEm.L D1/A0,-(A7)
JSR ADDBRANCHRELOC
MOVEm.L (a7)+,d1/a0
DBF D2,.x81_CLEANUP_LOOP
BRA .X_LOOP
;*-*
;; DELMEM
.x81_DELMEM:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_DELMEM_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L TOTALDELSIZE(PC),(A4)
DBF D2,.x81_DELMEM_LOOP
BRA .X_LOOP
;*-*
;; STKSIZE
.x81_STKSIZE:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
MOVE.L TOTALDELSIZE(PC),D1
ADD.L MINSTACK,D1
ADD.L GLOBSTACK,D1
BSR .x81_STKSIZE_CHECK
.x81_STKSIZE_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L D1,(A4)
DBF D2,.x81_STKSIZE_LOOP
BRA .X_LOOP
.x81_STKSIZE_CHECK:
MOVE.L CODESTACK,D3
BEQ .x81_STKSIZE_EXIT2
CMP.L D1,D3
BPL.S .x81_STKSIZE_CHECK2
BSET #2,WARNINGS+3
.x81_STKSIZE_CHECK2:
ADD.L #4000,D1
CMP.L D1,D3
BPL.S .x81_STKSIZE_EXIT
BSET #1,WARNINGS+3
BCLR #2,WARNINGS+3
.x81_STKSIZE_EXIT:
RTS
.x81_STKSIZE_EXIT2:
ADD.L #MINSTACKSIZE,D1
RTS
;*-*
;*-*
;*-*
;; 0x83
.x83:
MOVE.W NRGLOB,D1
LEA ._STKFRAME(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-44,D1
LEA .DBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-48,D1
LEA .IBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-52,d1
LEA .GBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-8,d1
LEA .SOUT(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-16,d1
LEA .SRAST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-32,d1
LEA .ARG(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-36,d1
LEA .WBMSG(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-56,D1
LEA .SBBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-60,D1
LEA .STBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-96,D1
LEA .XCPI(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-92,D1
LEA .SIN(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-120,D1
LEA .POOL(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-124,D1
LEA .UBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-4,D1
LEA .STKRET(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-20,D1
LEA .MEMLIST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-24,D1
LEA .EXITCODE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-40,D1
LEA .EBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-28,D1
LEA .RETVAL(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-64,D1
LEA .BTMSTK(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-128,D1
LEA .FILELIST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #0,D1
MOVE.W OSVERSION,D1
LEA .OSVERSION(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.W ASMCPU,D1
LEA .CPUFLAGS(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
CLR.W ERRWHERE
BRA ERROR42
;; names
.STKRET:
DC.B '_stkreturn',0
.MEMLIST:
Dc.b '_memlist',0
.EXITCODE:
DC.B '_exitcode',0
.BTMSTK:
dc.b '_bottomstk',0
.FILELIST:
DC.B '_filelist',0
.RETVAL:
DC.B '_clireturnvalue',0
._STKFRAME:
DC.B '_stkframe',0
.DBASE:
DC.B '_dosbase',0
.IBASE:
DC.B '_intuitionbase',0
.GBASE:
DC.B '_gfxbase',0
.EBASE:
DC.B '_execbase',0
.SOUT:
DC.B '_stdout',0
.SRAST:
DC.B '_stdrast',0
.ARG:
DC.B '_arg',0
.WBMSG:
DC.B '_wbmessage',0
.SBBASE:
DC.B '_mathieeesingbasbase',0
.STBASE:
DC.B '_mathieeesingtransbase',0
.XCP:
DC.B '_exception',0
.XCPI:
Dc.B '_exceptioninfo',0
.SIN:
DC.B '_stdin',0
.UBASE:
DC.B '_utilitybase',0
.POOL:
DC.B '_pool',0
.OSVERSION:
DC.B '_osversion',0
.CPUFLAGS:
DC.B '_cpuflags',0
EVEN
;*-*
;; subcode(s)
;; Fill
.x83_FILL:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x83_FILL_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.W D1,(A4)
DBF D2,.x83_FILL_LOOP
BRA .X_LOOP
;*-*
;*-*
;*-*
;*-*
ENDC
;; FIXSTARTUPCODE2
FIXSTARTUPCODE2:
MOVEM.L D0-A6,-(A7)
MOVE.L CURACODE,A0
MOVE.L STARTUP_XTNS,A1
.X_LOOP:
MOVE.L (A1)+,D0
BNE.S .X_CONT
MOVEM.L (A7)+,D0-A6
RTS
.X_CONT:
MOVE.L D0,D1
ROL.L #8,D1
AND.L #255,D1
AND.L #$FFFFFF,D0
MOVE.L A1,A5
LOWER2 A1,D2
MOVE.L A5,A1
BTST #7,D1
BEQ .x01
CMP.W #$81,D1
BEQ .x81
CMP.W #$83,D1
BEQ .x83
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D0
LSL.L #2,D0
ADD.L D0,A1
BRA .X_LOOP
;; Check
.CHECKNAME:
MOVE.L A1,-(A7)
MOVEQ #0,D2
.CHECKTST:
CMPM.B (A1)+,(A2)+
BNE .CHECKF
TST.B -1(A1)
BNE .CHECKTST
MOVEQ #-1,D2
.CHECKF:
MOVE.L (A7)+,A1
RTS
;*-*
;; x01
.x01:
LEA ._A4STORAGE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x01_A4STORAGE
CLR.W ERRWHERE
BRA ERROR42
;; names
._A4STORAGE:
DC.B '_a4storage',0
EVEN
;*-*
;; subcodes
;; A4STORAGE
.x01_A4STORAGE:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,A4STORAGEADR
BRA .X_LOOP
;*-*
;*-*
;*-*
;; x81
.x81:
LEA ._SETUP(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_SETUP
LEA ._DELMEM(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_DELMEM
LEA ._STKSIZE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_STKSIZE
MOVEQ #0,D1
MOVE.W OSVERSION,D1
LEA .OSVERSION(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_FILL
MOVE.W ASMCPU,D1
LEA .CPUFLAGS(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_FILL
LEA ._CLEANUP(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x81_CLEANUP
CLR.W ERRWHERE
BRA ERROR42
;; names
._SETUP:
DC.B '_setup',0
._CLEANUP:
DC.B '_cleanup',0
._DELMEM:
DC.B '_delmem',0
._STKSIZE:
DC.B '_stksize',0
EVEN
;*-*
;; subcodes
;; Fill
.x81_FILL:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_FILL_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L D1,(A4)
DBF D2,.x81_FILL_LOOP
BRA .X_LOOP
;*-*
;; SETUP
.x81_SETUP:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_SETUP_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVEQ #5,D0
MOVEm.L D1/A0,-(A7)
JSR ADDBRANCHRELOC
MOVEm.L (a7)+,d1/a0
DBF D2,.x81_SETUP_LOOP
BRA .X_LOOP
;*-*
;; CLEANUP
.x81_CLEANUP:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
BSET #6,ICODEPREFS+3
.x81_CLEANUP_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVEQ #8,D0
MOVEm.L D1/A0,-(A7)
JSR ADDBRANCHRELOC
MOVEm.L (a7)+,d1/a0
DBF D2,.x81_CLEANUP_LOOP
BRA .X_LOOP
;*-*
;; DELMEM
.x81_DELMEM:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x81_DELMEM_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L TOTALDELSIZE(PC),(A4)
DBF D2,.x81_DELMEM_LOOP
BRA .X_LOOP
;*-*
;; STKSIZE
.x81_STKSIZE:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
MOVE.L TOTALDELSIZE(PC),D1
ADD.L MINSTACK,D1
ADD.L GLOBSTACK,D1
BSR .x81_STKSIZE_CHECK
.x81_STKSIZE_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.L D1,(A4)
DBF D2,.x81_STKSIZE_LOOP
BRA .X_LOOP
.x81_STKSIZE_CHECK:
MOVE.L CODESTACK,D3
BEQ .x81_STKSIZE_EXIT2
CMP.L D1,D3
BPL.S .x81_STKSIZE_CHECK2
BSET #2,WARNINGS+3
.x81_STKSIZE_CHECK2:
ADD.L #4000,D1
CMP.L D1,D3
BPL.S .x81_STKSIZE_EXIT
BSET #1,WARNINGS+3
BCLR #2,WARNINGS+3
.x81_STKSIZE_EXIT:
RTS
.x81_STKSIZE_EXIT2:
ADD.L #MINSTACKSIZE,D1
RTS
;*-*
;*-*
;*-*
;; x83
.x83:
MOVE.W NRGLOB,D1
LEA ._STKFRAME(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-44,D1
LEA .DBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-48,D1
LEA .IBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-52,d1
LEA .GBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-8,d1
LEA .SOUT(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-16,d1
LEA .SRAST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-32,d1
LEA .ARG(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-36,d1
LEA .WBMSG(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-56,D1
LEA .SBBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #-60,D1
LEA .STBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-96,D1
LEA .XCPI(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-92,D1
LEA .SIN(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-120,D1
LEA .POOL(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-124,D1
LEA .UBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-4,D1
LEA .STKRET(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-20,D1
LEA .MEMLIST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-24,D1
LEA .EXITCODE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-40,D1
LEA .EBASE(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-28,D1
LEA .RETVAL(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-64,D1
LEA .BTMSTK(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.L #-128,D1
LEA .FILELIST(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVEQ #0,D1
MOVE.W OSVERSION,D1
LEA .OSVERSION(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
MOVE.W ASMCPU,D1
LEA .CPUFLAGS(PC),A2
BSR .CHECKNAME
TST.L D2
BNE .x83_FILL
CLR.W ERRWHERE
BRA ERROR42
;; names
.STKRET:
DC.B '_stkreturn',0
.MEMLIST:
Dc.b '_memlist',0
.EXITCODE:
DC.B '_exitcode',0
.BTMSTK:
dc.b '_bottomstk',0
.FILELIST:
DC.B '_filelist',0
.RETVAL:
DC.B '_clireturnvalue',0
._STKFRAME:
DC.B '_stkframe',0
.DBASE:
DC.B '_dosbase',0
.IBASE:
DC.B '_intuitionbase',0
.GBASE:
DC.B '_gfxbase',0
.EBASE:
DC.B '_execbase',0
.SOUT:
DC.B '_stdout',0
.SRAST:
DC.B '_stdrast',0
.ARG:
DC.B '_arg',0
.WBMSG:
DC.B '_wbmessage',0
.SBBASE:
DC.B '_mathieeesingbasbase',0
.STBASE:
DC.B '_mathieeesingtransbase',0
.XCP:
DC.B '_exception',0
.XCPI:
Dc.B '_exceptioninfo',0
.SIN:
DC.B '_stdin',0
.UBASE:
DC.B '_utilitybase',0
.POOL:
DC.B '_pool',0
.OSVERSION:
DC.B '_osversion',0
.CPUFLAGS:
DC.B '_cpuflags',0
EVEN
;*-*
;; subcode(s)
;; Fill
.x83_FILL:
LSL.L #2,D0
ADD.L D0,A1
MOVE.L (A1)+,D2
SUBQ.L #1,D2
.x83_FILL_LOOP:
MOVE.L A0,A4
ADD.L (A1)+,A4
MOVE.W D1,(A4)
DBF D2,.x83_FILL_LOOP
BRA .X_LOOP
;*-*
;*-*
;*-*
;*-*
;*-*
;; background
BGCODE:
bra dobg
BGS:
MOVE.L $4.W,A6
move.l a0,a5
move.l d0,d7
SUB.L A1,A1
JSR -294(A6)
MOVE.L D0,A1
TST.L $AC(A1)
BNE.S BGRUNCODE
BGFILL:
DC.W $4EF9,0,0
BGRUNCODE
LEA BGS(PC),A1 ; start of next hunk
MOVE.L -(A1),D3 ; pick and
CLR.L (A1) ; clear
LEA $17A(A6),A0 ; find dos.library
LEA DOSNAME(PC),A1
JSR -276(A6)
move.l d0,-(a7) ; and store
LEA BGTAGS(PC),A4 ;
MOVE.L A4,D6
BRA.S BGSKIP
BGTAGS:
DC.L $800003e9,0 ; seglist
DC.L $800003fd,0 ; args
DC.L $800003fA,1 ; cli
DC.L $00000000,0 ; tag_done
BGSKIP:
ADDQ.L #4,A4
MOVE.L D3,(A4)+
ADDQ.L #4,A4
MOVE.L A5,(A4)+
MOVE.L D6,D1
MOVE.L (A7)+,A6
JSR -498(a6)
moveq #0,d0
rts
DOSNAME:
dc.b 'dos.library',0,0,0
even
BGE:
dobg:
LEA BGS(PC),A0
MOVE.L #BGFILL,D0
ADDQ.L #2,D0
BSR COPYC
MOVE.L #BGE-BGS,D0
TST.L bgName
BEQ .bg1
ADDQ.L #8,D0
.bg1:
TST.L bgPri
BEQ .bg2
ADDQ.L #8,D0
.bg2:
MOVE.L D0,D7
MOVE.L A0,-(A7)
JSR FORCEABSHERE
MOVE.L (A7)+,A0
ADDQ.L #4,A0
MOVE.L #BGTAGS+24,D0
BSR COPYC
MOVE.L A4,A6
SUB.L #25,A6
TST.L bgName
BEQ .dobg2
MOVE.L #$80000000+1012,(a4)+
MOVE.L D7,D0
ADD.L #ENDC-FIRSTSTART,D0
ADDQ.B #8,(A6)
ADDQ.W #8,-15(A6)
MOVE.L A0,-(A7)
JSR FORCEABSHERE
MOVE.L (A7)+,A0
.dobg2:
TST.L bgPri
BEQ .dobg3
MOVE.L #$80000000+1013,(a4)+
ADDQ.B #8,(A6)
ADDQ.W #8,-15(A6)
move.l bgPri(PC),(A4)+
.dobg3:
MOVE.L #BGE,D0
BSR COPYC
MOVE.L HunkList(PC),A0
MOVE.L A4,H_END(A0)
MOVE.L A0,D0
ADDQ.L #1,NumHunks
GETM A0 ; fill the 0-hunk structure!
MOVE.L HunkList(PC),(A0)+ ;
MOVE.L A0,HunkList ;
EXG.L A0,D0
MOVE.L D0,H_PREV(A0)
EXG.L A0,D0
MOVE.L A4,(A0)+ ; start
MOVE.L #$3e9,(A0)+ ; type
clr.l (a0)+ ; end
clr.l (a0)+ ; prev
clr.l (a0)+ ; reloc
DONEM A0 ; We'll use it for writing the stuff :)
RTS
;*-*
A4STORAGEADR:
DC.L A4STORAGE_NOST-NSFIRSTSTART
; NEEDS TO GEN T/F IN D2
;; Additional code - init
MATHINITETC: ; A4=CODE
BTST #5,CODEPREFS
BEQ ._1
RTS
._1:
BTST #6,ICODEPREFS+3
BNE .0
BTST #2,CODEPREFS
BEQ.S .0
RTS
.0: MOVE.W .T(PC),(A4)+
BTST #3,CODEPREFS+1
BEQ.S .1
LEA OPENMATHBAS(PC),A0
MOVE.L #OPENBASEND,D0
BSR CCOPY
.1: BTST #4,CODEPREFS+1
BEQ.S .2
LEA OPENMATHTRANS(PC),A0
MOVE.L #OPENTRANSEND,D0
BSR CCOPY
.2: BTST #7,CODEPREFS
BEQ .3
BTST #4,CODEPREFS
BNE ERROR50
LEA OPENUTIL(PC),A0
MOVE.L #OPENUTILEND,D0
BSR CCOPY
.3: BTST #6,CODEPREFS
BEQ .4
BTST #4,CODEPREFS
BNE ERROR50
LEA OPENPOOL(PC),A0
MOVE.L #OPENPOOLEND,D0
BSR CCOPY
.4: BTST #3,CODEPREFS
BEQ .5
LEA OPENFILES(PC),A0
MOVE.L #OPENFILESEND,D0
BSR CCOPY
.5: CMP.W #37,OSVERSION
BLT .6
BTST #4,CODEPREFS
BNE .6
LEA OPENCON37P(PC),A0
MOVE.L #OPENCON37PEND,D0
BSR CCOPY
.6: TST.W ASMCPU
BEQ .7
BTST #4,CODEPREFS
BNE .7
LEA CHECK_CPU_FPU(PC),A0
MOVE.W ASMCPU,2(A0)
MOVE.L #LK0000,D0
BSR CCOPY
JSR NEWLABEL
JSR ADDBRANCH
MOVE.L D0,-(A7)
LEA LK0000(PC),A0
MOVE.L #CHECK_CPU_FPU_END,D0
BSR CCOPY
BSR ADDERR
MOVE.L (A7)+,D0
JSR ADDLABEL
.7: BTST #0,CODEPREFS+2
BEQ .8
BTST #4,CODEPREFS
BNE .8
LEA CHECK_OSVERSION(PC),A0
MOVE.W OSVERSION,2(A0)
MOVE.L #LK0001,D0
BSR CCOPY
JSR NEWLABEL
JSR ADDBRANCH
MOVE.L D0,-(A7)
LEA LK0001(PC),A0
MOVE.L #CHECK_OSVERSION_END,D0
BSR CCOPY
BSR ADDERR
MOVE.L (A7)+,D0
JSR ADDLABEL
.8: BTST #0,CODEPREFS
BEQ .9
LEA OPEN_POWERPC(PC),A0
MOVE.L #OPEN_POWERPC_END,D0
BSR CCOPY
BSR ADDERR
.9:
LEA SetupMod+4(PC),A0
.A: MOVE.L -4(A0),D0
BEQ .C
MOVE.L D0,A0
MOVE.W .U(PC),(A4)+
MOVE.L A0,-(A7)
MOVE.L (A0),A0
MOve.L 14(A0),A0
MOVEQ #0,D0
MOVE.W 10(A0),D0
JSR ADDBRANCHRELOC
MOVE.L (A7)+,A0
BRA .A
.C:
RTS
.T: MOVEQ #-1,D2
.U: JSR .U
ADDERR:
MOVE.W InitError(PC),D0
BNE.S .AddErr2
JSR NEWLABEL
MOVE.W D0,InitError
.AddErr2:
MOVE.W .JSR,NEWOP
.JSR:
JSR ADDBRANCH
RTS
ADDERRCODE:
MOVE.W InitError,D0
BEQ .EXIT
JSR ADDLABEL
LEA InitializationError(PC),A0
MOVe.L #InitializationErrorEnd,D0
BSR CCOPY
.EXIT:
RTS
;*-*
;; Additional code - exit
MATHEXITETC:
TSTMOD
BNE .EX
BTST #5,CODEPREFS
BNE .EX
BTST #6,ICODEPREFS+3
BNE .0
BTST #2,CODEPREFS
BNE .EX
.0:
MOVE.L CURACODE,A4 ; A4=CODE
MOVEQ #8,D0
JSR ADDLABEL
LEA CleanupMod+4(PC),A0
.8: MOVE.L -4(A0),D0
BEQ .9
MOVE.L D0,A0
MOVE.W .JSR(PC),(A4)+
MOVE.L A0,-(A7)
MOVE.L (A0),A0
MOve.L 14(A0),A0
MOVEQ #0,D0
MOVE.W 10(A0),D0
JSR ADDBRANCHRELOC
MOVE.L (A7)+,A0
BRA .8
.9:
BTST #3,CODEPREFS+1
BEQ.S .1
LEA CLOSEMATHBAS(PC),A0
MOVE.L #CLOSEBASEND,D0
BSR CCOPY
.1: BTST #4,CODEPREFS+1
BEQ.S .2
LEA CLOSEMATHTRANS(PC),A0
MOVE.L #CLOSETRANSEND,D0
BSR CCOPY
.2: BTST #7,CODEPREFS
BEQ .3
BTST #4,CODEPREFS
BNE ERROR50
LEA CLOSEUTIL(PC),A0
MOVE.L #CLOSEUTILEND,D0
BSR CCOPY
.3: BTST #6,CODEPREFS
BEQ .4
BTST #4,CODEPREFS
BNE ERROR50
LEA CLOSEPOOL(PC),A0
MOVE.L #CLOSEPOOLEND,D0
BSR CCOPY
.4: BTST #3,CODEPREFS
BEQ .5
LEA CLOSEFILES(PC),A0
MOVE.L #CLOSEFILESEND,D0
BSR CCOPY
.5: CMP.W #37,OSVERSION
BLT .5_5
LEA CLOSECON37P(PC),A0
MOVE.L #CLOSECON37PEND,D0
BSR CCOPY
BRA .6
.5_5:
LEA CLOSECON33_37(PC),A0
MOVE.L #CLOSECON33_37END,D0
BSR CCOPY
.6: BTST #0,CODEPREFS
BEQ .7
LEA CLOSE_POWERPC(PC),A0
MOVE.L #CLOSE_POWERPC_END,D0
BSR CCOPY
.7:
MOVE.W .RTS(PC),(A4)+
BSR ADDERRCODE
MOVE.L A4,CURACODE
JSR CHECK3
.EX:
.RTS: RTS
.JSR: JSR .JSR
;*-*
;; Copy
CCOPY:
SUB.L A0,D0
LSR.L #1,D0
SUBQ.L #1,D0
.XL:MOVE.W (A0)+,(A4)+
DBRA D0,.XL
RTS
;*-*
;; Check CPU/FPU
CHECK_CPU_FPU:
MOVE.W #0,D0
BRA.S LM1
LM0:DC.B 'This program requires a better CPU/FPU',10,0
LM1:MOVE.L $4.W,A6
AND.W 296(A6),D0
BNE CHECK_CPU_FPU_END
LK0000:
LEA LM0(PC),A0
MOVEQ #2,D7
BRA CHECK_CPU_FPU_END
CHECK_CPU_FPU_END:
;*-*
;; Check OSVersion
CHECK_OSVERSION:
MOVE.W #0,D0
BRA.B LM3
LM2:DC.B 'This program requires a newer OS',10,0
LM3:MOVE.L $4.W,A6
CMP.W 20(A6),D0
BLE CHECK_OSVERSION_END
LK0001:
MOVE.L #$38001,D7
LEA LM2(PC),A0
BRA CHECK_OSVERSION_END
CHECK_OSVERSION_END:
;*-*
;; OpenCon37+
OPENCON37P:
BRA.S .X
DC.B 'CON:0/11/640/80/Output/AUTO/CLOSE/WAIT',0
EVEN
.X: MOVE.L -44(A4),A6
LEA OPENCON37P+2(PC),A0
MOVE.L A0,D1
MOVE.L #1006,d2
JSR -30(a6)
MOVE.L D0,-12(A4)
TST.L -8(A4)
BNE.S OPENCON37PEND
MOVE.L D0,-8(A4)
OPENCON37PEND:
;*-*
;; OpenPool
OPENPOOL:
MOVE.L #$10001,D0
MOVE.L #10240,D1
MOVE.L #256,D2
MOVE.L $4,A6
JSR -696(A6)
MOVE.L D0,-120(A4)
OPENPOOLEND:
;*-*
;; OpenUtil
OPENUTIL:
BRA.S OPENUTIL2
UTILNAME:
DC.B "utility.library",0
EVEN
OPENUTIL2:
MOVE.L $4.W,A6
LEA UTILNAME(PC),A1
MOVEQ #33,D0
JSR -552(A6)
MOVE.L D0,-124(A4)
BNE.S OPENUTILEND
MOVEQ #0,D2
OPENUTILEND:
;*-*
;; OpenMathBas
OPENMATHBAS:
BRA.S BASCONT
INITMATH:
DC.B "mathieeesingbas.library",0
EVEN
BASCONT:
MOVE.L 4.W,A6
LEA INITMATH(PC),A1
MOVEQ #33,D0
JSR -552(A6)
MOVE.L D0,-56(A4)
BNE.S OPENBASEND
MOVEQ #0,D2
OPENBASEND:
;*-*
;; OpenMathTrans
OPENMATHTRANS:
BRA.S TRANSCONT
INITMATHT:
DC.B "mathieeesingtrans.library",0
EVEN
TRANSCONT:
MOVE.L 4.W,A6
LEA INITMATHT(PC),A1
MOVEQ #33,D0
JSR -552(A6)
MOVE.L D0,-60(A4)
BNE.S OPENTRANSEND
MOVEQ #0,D2
OPENTRANSEND:
;*-*
;; OpenFiles
OPENFILES:
CLR.L -128(A4)
OPENFILESEND:
;*-*
;; OpenPowerPC
OPEN_POWERPC:
LEA .LB(PC),A1
MOVEQ #0,D0
MOVE.L $4.W,A6
JSR -552(A6)
MOVE.L D0,-132(a4)
BNE.S OPEN_POWERPC_END
BRA.S .X
.M: DC.B 'This program requires '
.LB:DC.B 'powerpc.library'
.Z: DC.B 0,0,0
.X: LEA .M(PC),A0
LEA .Z(PC),A1
MOVE.B #10,(A1)
BRA OPEN_POWERPC_END
OPEN_POWERPC_END:
;*-*
;; InitError
InitializationError:
TST.L -8(A4)
BEQ.S .ALERT
MOVE.L A0,D2
.c: TST.B (A0)+
BNE .c
MOVe.L A0,D3
SUB.L D2,D3
MOVe.L -8(A4),D1
MOVE.L -44(A4),A6
JSR -48(A6)
BRA.S .QUIT
.ALERT:
MOVE.L -40(A4),A6
JSR -108(A6)
.QUIT:
MOVE.L -24(A4),A0
move.l #20,-28(a4)
JMP (A0)
InitializationErrorEnd:
;*-*
;; ClosePool
CLOSEPOOL:
MOVE.L $4.W,A6
MOVE.L -120(A4),A0
JSR -702(A6)
CLOSEPOOLEND:
;*-*
;; CloseUtil
CLOSEUTIL:
MOVE.L $4.W,A6
MOVE.L -124(A4),D0
BEQ CLOSEUTILEND
MOVE.L D0,A1
JSR -414(A6)
CLOSEUTILEND:
;*-*
;; CloseMathBas
CLOSEMATHBAS:
MOVE.L 4.W,A6
MOVE.L -56(A4),D0
BEQ.S CLOSEBASEND
MOVE.L D0,A1
JSR -414(A6)
CLOSEBASEND:
;*-*
;; CloseMathTrans
CLOSEMATHTRANS:
MOVE.L 4.W,A6
MOVE.L -60(A4),D0
BEQ.S CLOSETRANSEND
MOVE.L D0,A1
JSR -414(A6)
CLOSETRANSEND:
;*-*
;; CloseFiles
CLOSEFILES:
move.l -128(a4),d0
beq CLOSEFILESEND
.1: move.l d0,a0
move.l (a0),d4
move.l 4(a0),d5
move.l a0,a1
moveq #8,d0
move.l -40(a4),a6
jsr -210(a6)
move.l d5,d1
move.l -44(a4),a6
jsr -36(a6)
move.l d4,d0
bne .1
CLOSEFILESEND:
;*-*
;; CloseCon37+
CLOSECON37P:
MOVE.L -12(A4),D1
BEQ CLOSECON37PEND
MOVE.L -44(a4),A6
JSR -36(A6)
CLR.L -12(A4)
CLOSECON37PEND:
;*-*
;; CloseCon33-37
CLOSECON33_37:
MOVE.L -12(A4),D1
BEQ CLOSECON33_37END
MOVE.L -44(a4),A6
MOVE.L D1,D4
MOVEQ #0,D2
MOVEQ #0,D3
JSR -42(A6)
MOVE.L D4,D1
JSR -36(A6)
CLR.L -12(A4)
CLOSECON33_37END:
;*-*
;; ClosePowerPC
CLOSE_POWERPC:
MOVE.L $4.W,A6
MOVE.L -132(A4),A1
JSR -414(A6)
CLOSE_POWERPC_END:
;*-*
;; Add global vars
ADDGLOBVARS:
BTST #3,CODEPREFS+3
BEQ.S .C
RTS
.C: GETM A5
LEA GLOBVARTAB(PC),A4
.1: MOVE.L (A4)+,D7
MOVE.L (A4)+,D6
BEQ .2
CMP.L #GLOBVARTAB+24,A4
BNE.S .NARG
LEA 9(A5),A1
MOVE.L A1,ARGBYTE
.NARG:
CMP.L #GLOBVARTAB+32,A4
BNE.S .NEXC
MOVE.L A5,VAR_EXECBASE
ADDQ.L #4,VAR_EXECBASE
.NEXC:
CMP.L #GLOBVARTAB+40,A4
BNE.S .NDOS
MOVE.L A5,VAR_DOSBASE
ADDQ.L #4,VAR_DOSBASE
.NDOS:
CMP.L #GLOBVARTAB+48,A4
BNE.S .NINT
MOVE.L A5,VAR_INTUIBASE
ADDQ.L #4,VAR_INTUIBASE
.NINT:
CMP.L #GLOBVARTAB+56,A4
BNE.S .NGFX
MOVE.L A5,VAR_GFXBASE
ADDQ.L #4,VAR_GFXBASE
.NGFX:
CMP.L #GLOBVARTAB+64,A4
BNE.S .NRST
MOVE.L A5,VAR_RASTPORT
ADDQ.L #4,VAR_RASTPORT
.NRST:
CMP.L #GLOBVARTAB+72,A4
BNE.S .NWBM
MOVE.L A5,VAR_WBMESSAGE
ADDQ.L #4,VAR_WBMESSAGE
.NWBM:
.FILL:
MOVE.L D7,A1
HASH A1,D0,D1
LSL.L #2,D0
MOVE.L #IDENTHASH,A1
ADD.L D0,A1
MOVE.L (A1),(A5)+
MOVE.L A5,(A1)
MOVE.L #PSEUDOA4,A1
MOVE.L A5,(A1,D6)
MOVE.L D7,(A5)+ ; SET ASCIIPTR
MOVE.B #GLOBV,(A5)+ ; SET GLOBAL(=2)
MOVE.B #2,(A5)+ ; UNREF+SYSTEMVAR
CLR.L (A5)+
MOVE.W D6,(A5)+ ; SET OFFS
BRA .1
.2: DONEH A5
;*-*
;; Add global consts
BURP: MOVEQ #NRSYSCONST,D0
SUBQ.W #1,D0
GETM A0
LEA SYSCONST(PC),A1
.3: MOVE.L (A1)+,A2
MOVE.L A2,A3
HASH A3,D1,D2
LSL.L #2,D1
ADD.L #CONSTHASH,D1
MOVE.L D1,A3
MOVE.L (A3),(A0)
MOVE.L A0,(A3)
ADDQ.L #4,A0
MOVE.L A2,(A0)+
CMPA.L #SYSCONST+36,A1
BNE.S .SL
MOVE.L A0,STRLENADR
.SL: MOVE.L (A1)+,(A0)+
CLR.W (A0)+
DBRA D0,.3
DONEH A0
RTS
;*-*
;; Consts
NRSYSCONST = 20
STRLENADR: DC.L 0
SYSCONST:
DC.L .1,-1,.2,0,.3,0,.4,-1,.5,0,.6,120,.7,1005,.8,1006,.9,0,.10,0
DC.L .11,0,.12,1,.13,2,.14,.3,.15,$80000000,.16,-1,.17,-1,.18,0,.19,1,.20,1004
.1: DC.B "TRUE",0
.2: DC.B "FALSE",0
.3: DC.B "NIL",0
.4: DC.B "ALL",0
.5: DC.B "STRLEN",0 ; MUST BE #5
.6: DC.B "GADGETSIZE",0
.7: DC.B "OLDFILE",0
.8: DC.B "NEWFILE",0
.9: DC.B "EMPTY",0
.10:DC.B "TAG_DONE",0
.11:DC.B "TAG_END",0
.12:DC.B "TAG_IGNORE",0
.13:DC.B "TAG_MORE",0
.14:DC.B "TAG_SKIP",0
.15:DC.B "TAG_USER",0
.16:DC.B "OFFSET_BEGINNING",0
.17:DC.B "OFFSET_BEGINING",0
.18:DC.B "OFFSET_CURRENT",0
.19:DC.B "OFFSET_END",0
.20:DC.B "READWRITE",0
EVEN
;*-*
;; Vars
ARGBYTE: DC.L 0 ; EXACT BYTE LOC OF "arg".FLAGS
GLOBVARTAB:
DC.L .1,-8
DC.L .2,-12
DC.L .3,-32 ; must be 16..24 bytes offset
DC.L .4,-40 ; must be 24..32 bytes offset!!!
DC.L .5,-44 ; keep the places!!!
DC.L .6,-48 ; _UNCHANGED_
DC.L .7,-52 ; those vars refer to special
DC.L .8,-16 ; pointers!
DC.L .9,-36
; DC.L .10,-56
DC.L .11,-84
DC.L .12,-92
DC.L .13,-96
DC.L .14,-120
DC.L .15,-124
DC.L 0,0
.1: DC.B "stdout",0
.2: DC.B "conout",0
.3: DC.B "arg",0 ; MUST BE 3RD
.4: DC.B "execbase",0
.5: DC.B "dosbase",0
.6: DC.B "intuitionbase",0
.7: DC.B "gfxbase",0
.8: DC.B "stdrast",0
.9: DC.B "wbmessage",0
;.10: DC.B "mathieeesingbasbase",0
.11: DC.B "exception",0
.12: DC.B "stdin",0
.13: DC.B "exceptioninfo",0
.14: DC.B "__pool",0
.15: DC.B "utilitybase",0
EVEN
;*-*
;; Init funcs
INITFUNCS: ; init efuncs
MOVE.L #EFUNCBYTE,A0
MOVE.L #EFUNCRAISE,A1
MOVE.W #NREFUNC,D0
SUBQ.W #1,D0
MOVEQ #0,D1
.1: MOVE.B D1,(A0)+
MOVE.W D1,(A1)+
ADDQ.L #8,A1
DBRA D0,.1
RTS
;*-*
;; Link delegate constructors
LINKDELEGATECONSTRUCTORS:
LEA OLIST+4,A0
.XL:MOVE.L -(A0),D0
BEQ .X
MOVE.L D0,A0
TST.W ODEL(A0)
BEQ.S .XL
BTST #1,OFLAGS(A0)
BNE.S .XL
MOVE.L CURACODE,A4 ; 32K VERWEG !
MOVE.L A4,ODCODE(A0) ; SET DCODE FOR THIS OBJECT
MOVE.L OSUPER(A0),D0
BEQ.S .NSUP
MOVE.L D0,A2 ; A2=SUPER
TST.W (A2) ; CHECK IF SUPER HAS DELCONSTRUCTOR
BEQ.S .NSUP
GETM A1
MOVE.L OACC(A2),(A1) ; ADD TO ACCESSLIST OF SUPER
MOVE.L A1,OACC(A2)
ADDQ.L #4,A1
MOVE.W .J(PC),(A4)+ ; MAKE JSR SUPERDELEGATECONSTR.
MOVE.L A4,(A1)+
MOVE.W #1,(A1)+
DONEM A1
CLR.L (A4)+
.NSUP: MOVE.W .GL(PC),(A4)+
MOVEQ #0,D0
MOVE.W OSIZE(A0),D0
MOVE.L D0,(A4)+
MOVE.L OMETHOD(A0),A1 ; A1=METHODLIST
.ML: BTST #0,M_FLAGS(A1)
BNE.S .N
MOVE.L M_PROC(A1),A2
MOVE.L 14(A2),A2 ; A2=IDENT
MOVE.L .MLEA(PC),(A4)+
MOVE.W .MLEA2(PC),NEWOP
MOVE.W 10(A2),D0
MOVE.L A0,A3
JSR ADDBRANCH
MOVE.L A3,A0
MOVE.W .MM(PC),(A4)+
MOVE.W M_OFF(A1),(A4)+
.N: MOVE.L (A1),A1
MOVE.L A1,D0
BNE.S .ML
MOVE.W .RTS(PC),(A4)+
MOVE.L A4,CURACODE
JSR CHECK3
BRA .XL
.X: RTS
.J: JSR .X
.MLEA: LEA .X(PC),A1
.MLEA2: LEA .X,A1
.MM: MOVE.L A1,4(A0)
.RTS: RTS
.GL: MOVE.L #1,(A0)
;*-*
;; Link funcs
LINKFUNCS:
MOVEM.L A6/D7,-(A7)
TSTMOD
BNE.S .X
LEA EFUNCFLAGSTAB,A6
MOVE.L #EFUNCBYTE,A3
MOVE.W #NREFUNC,D2
SUBQ.W #1,D2
MOVE.L #EFUNCTAB,D4
MOVEQ #0,D3
MOVE.L CURACODE,A4 ; 32K VERWEG !
.1: TST.B (A3)+
BEQ.S .2
MOVE.W D3,D0 ;
LSL.W #1,D0 ;
MOVE.W 0(A6,D0),D7 ;
MOVE.L D4,A1
MOVE.L D3,D0
MULU #EFUNCENTRYSIZE,D0
ADD.L D0,A1
MOVE.L 4(A1),A2 ; BEG CODE
MOVE.L 8(A1),D1 ; END CODE
MOVE.L D3,D0
ADD.L #10,D0
JSR ADDLABEL
SUB.L A2,D1
LSR.L #1,D1
SUBQ.L #1,D1
.3: MOVE.W (A2)+,(A4)+
DBRA D1,.3
.2: ADDQ.L #1,D3
MOVE.L A4,CURACODE
JSR CHECK3
DBRA D2,.1
.X: MOVEM.L (A7)+,A6/D7
RTS
;*-*
;; Link lib
LINKLIB:
MOVEM.L D6/D7/A0-A2/A5/A6,-(A7)
MOVE.L #LIBHASH,A2
MOVE.l #255,D6
MOVE.L CURACODE,A4
.1:
MOVE.L (A2)+,D0
.LOOP:
TST.L D0
BEQ.S .EXIT
MOVE.L D0,A0
MOVE.L LIB_NEXT(A0),D0
TST.L LIB_USED(A0)
BEQ .LOOP
CMP.W #1,LIB_TYPE(A0)
BEQ .LOOP
CMP.W #2,LIB_TYPE(A0)
BEQ .LOOP
MOVE.L A4,A6
MOVE.L A4,LIB_USED(A0)
MOVE.L LIB_CLEN(A0),d7
move.l LIB_CODE(a0),a1
lsr.l #2,d7
subq.l #1,d7
move.l a4,a6
.COPY:
move.l (a1)+,(a4)+
dbf d7,.COPY
bsr FIXRELOC
bra .LOOP
.EXIT:
DBRA D6,.1
MOVE.L A4,CURACODE
movem.l (a7)+,D6/d7/A0-A2/A5/a6
rts
;*-*
;; FixReloc
FIXRELOC:
; A6 - copied code start
; A0 - code node
MOVEM.L D0-A6,-(A7)
MOVE.L LIB_RELO(A0),d1 ; reloc
BEQ .EXIT
MOVE.L D1,A1
cmp.l #$3EC,(A1)+
BNE ERROR51
move.l (a1)+,d3
addq.l #4,a1 ; code
subq.l #1,d3
.LOOP:
MOVE.L (a1)+,d2
move.l a6,a4
add.l d2,a4
move.l (a4),d0
add.l a6,d0
sub.l ACODE,d0
jsr FORCEABSHERE
dbf D3,.LOOP
.EXIT:
MOVEM.L (A7)+,D0-A6
RTS
;*-*
;*-*
;; GenVars
; THESE ARE SHARED!
GVA0D0D5_0:
GENVAR 0,A0,D0,D5 ; IIII
RTS
GVA0D0_0:
GENVAR 0,A0,10(A0),D0 ; III
RTS
GVA1D0_0:
GENVAR 0,A1,10(A1),D0 ; III
RTS
GVA0D1_0:
GENVAR 0,A0,10(A0),D1 ; IIIII
RTS
GVA0D2_0:
MOVE.L D1,-(A7)
MOVE.L D2,D1
BSR GVA0D1_0 ; II
MOVE.L (A7)+,D1
RTS
GVA0D3_0:
MOVE.L D1,-(A7)
MOVE.L D3,D1
BSR.W GVA0D1_0 ; I
MOVE.L (A7)+,D1
RTS
GVA0D4_0:
MOVE.L D1,-(A7)
MOVE.L D4,D1
BSR.W GVA0D1_0 ; I
MOVE.L (A7)+,D1
RTS
GVA1D2_0:
GENVAR 0,A1,10(A1),D2 ; I
RTS
GVA6D3_0:
GENVAR 0,A6,10(A6),D3 ; I
RTS
GVA0D0_9:
GENVAR 9,A0,10(A0),D0 ; II
RTS
GVA0D2_9:
MOVE.L D0,-(A7)
MOVE.L D2,D0
BSR.W GVA0D0_9 ; I
MOVE.L (A7)+,D0
RTS
GVA0D4_9:
MOVE.L D0,-(A7)
MOVE.L D4,D0
BSR.W GVA0D0_9 ; II
MOVE.L (A7)+,D0
RTS
GVA0D5_9:
MOVE.L D0,-(A7)
MOVE.L D5,D0
BSR.W GVA0D0_9 ; I
MOVE.L (A7)+,D0
RTS
GVA0D7_9:
MOVE.L D0,-(A7)
MOVE.L D7,D0
BSR.W GVA0D0_9 ; I
MOVE.L (A7)+,D0
RTS
GVA1D2_9:
GENVAR 9,A1,10(A1),D2 ; I
RTS
GVA6D0_9:
GENVAR 9,A6,10(A6),D0 ; I
RTS
GVA6D3_9:
MOVE.L D0,-(A7)
MOVE.L D3,D0
BSR.W GVA6D0_9 ; II
MOVE.L (A7)+,D0
RTS
;*-*